データフレームdf
を次のように想定します。
df <- structure(list(city = structure(c(5L, 4L, 1L, 6L, 3L, 7L, 2L), .Label = c("dc",
"ld", "nj", "ny", "week1", "week2", "wt"), class = "factor"),
area = c(3L, 2L, 1L, 8L, 3L, 3L, 2L), price = c(7L, 4L, 3L,
5L, 1L, 2L, 2L)), class = "data.frame", row.names = c(NA,
-7L))
アウト:
city area price
week1 3 7
ny 2 4
dc 1 3
week2 8 5
nj 3 1
wt 3 2
ld 2 2
上記のデータフレームでは、week1
行はの合計でny
ありdc
、week2
はの合計ですnj, wt, ld
。どうすればそれweek2
を2つのデータフレームに分割してweek
行を削除できますか?
期待される結果は次のようになります。
df1:
city area price
ny 2 4
dc 1 3
df2:
city area price
nj 3 1
wt 3 2
ld 2 2
私の考えは、の位置を取得してからweek2
、以下を使用することです。
df1 = df[1:index,]
df2 = df[(index +1) : nrow(df),]
それは理にかなっていますか?ありがとう。
'週'行の位置を見つけて、それに基づいてデータを分割できます。次に、各リストから1行目を削除できます。
result <- lapply(split(df, cumsum(grepl('week', df$city))), function(x) x[-1, ])
または以下で短くするby
:
result <- by(df, cumsum(grepl('week', df$city)), function(x) x[-1, ])
別の方法は次のようになりますMap
:
inds <- grep('week', df$city)
result <- Map(function(x, y) df[x:y, ],inds + 1, c(inds[-1] - 1, nrow(df)))
result
#[[1]]
# city area price
#2 ny 2 4
#3 dc 1 3
#[[2]]
# city area price
#5 nj 3 1
#6 wt 3 2
#7 ld 2 2
次の方法でリストに名前を割り当てることができますresult
。
names(result) <- paste0('df', seq_along(result))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加