我有一個資料框,其中一列是向量串列,長度不一。此代碼創建一個示例:
df1 <- data.frame(
A=c("able", "baker", "carr"),
B=c("whiskey", "tango", "foxtrot")
)
df1$C <- list(14, c(2,18,32), c(10,6))
實際資料源自 SPSS 資料庫。(順便說一句,我不知道如何用一條陳述句創建這個示例。)
我想將其轉換為如下代碼創建的資料框:
df2 <- data.frame(
A=c("able", rep("baker",3), rep("carr",2)),
B=c("whiskey", rep("tango",3), rep("foxtrot",2)),
C=c(14, 2, 18, 32, 10, 6)
)
我不想訴諸丑陋的手術和回圈——去過那里,做過。
uj5u.com熱心網友回復:
library(tidyr)
df2 <- unnest(df1, cols = "C")
結果:
# A tibble: 6 × 3
A B C
<chr> <chr> <dbl>
1 able whiskey 14
2 baker tango 2
3 baker tango 18
4 baker tango 32
5 carr foxtrot 10
6 carr foxtrot 6
uj5u.com熱心網友回復:
沒有明確的回圈,也不確定這是否是丑陋的手術,但這是一個基本的 R 方法,感謝@onyambu 更干凈
# For each row Unroll by length of df1$C: res => data.frame
res <- transform(
df1[
rep(
seq(
nrow(df1)
),
lengths(df1$C)
),
],
C = unlist(df1$C),
row.names = NULL
)
uj5u.com熱心網友回復:
我們可能會rep根據lengths串列和unlist它們來吃行。
cbind(df1[rep.int(seq_len(dim(df1)[1]), lengths(df1$C)), -3], C=unlist(df1$C))
# A B C
# 1 able whiskey 14
# 2 baker tango 2
# 2.1 baker tango 18
# 2.2 baker tango 32
# 3 carr foxtrot 10
# 3.1 carr foxtrot 6
因此,要將其推廣到這樣的資料幀,
df2
# A B C D E
# 1 able whiskey 14 2, 18, 32 2, 18, 32
# 2 baker tango 2, 18, 32 14 10, 99
# 3 carr foxtrot 10, 6 10, 99 14
我們可能會這樣做:
flatten <- function(dat, cols) {
ls <- as.data.frame(sapply(dat[cols], lengths))
lsp <- apply(ls, 1, prod)
cbind(dat[rep.int(seq_len(dim(dat)[1]), lsp), setdiff(names(dat), cols)],
sapply(cols, function(x)
unlist(Map(function(x, y) rep(x, each=prod(y)),
dat[[x]],
apply(ls[setdiff(names(ls), x)], 1, prod)))))
}
flatten(df2, cols=c('C', 'D', 'E'))
# A B C D E
# 1 able whiskey 14 2 2
# 1.1 able whiskey 14 2 2
# 1.2 able whiskey 14 2 2
# 1.3 able whiskey 14 18 18
# 1.4 able whiskey 14 18 18
# 1.5 able whiskey 14 18 18
# 1.6 able whiskey 14 32 32
# 1.7 able whiskey 14 32 32
# 1.8 able whiskey 14 32 32
# 2 baker tango 2 14 10
# 2.1 baker tango 2 14 10
# 2.2 baker tango 18 14 10
# 2.3 baker tango 18 14 99
# 2.4 baker tango 32 14 99
# 2.5 baker tango 32 14 99
# 3 carr foxtrot 10 10 14
# 3.1 carr foxtrot 10 10 14
# 3.2 carr foxtrot 6 99 14
# 3.3 carr foxtrot 6 99 14
順便說一句,用您可以使用的單個陳述句創建您的示例list2DF。
list2DF(list(A=c("able", "baker", "carr"),
B=c("whiskey", "tango", "foxtrot"),
C=list(14, c(2, 18, 32), c(10, 6))))
# A B C
# 1 able whiskey 14
# 2 baker tango 2, 18, 32
# 3 carr foxtrot 10, 6
資料:
df1 <- structure(list(A = c("able", "baker", "carr"), B = c("whiskey",
"tango", "foxtrot"), C = list(14, c(2, 18, 32), c(10, 6))), row.names = c(NA,
-3L), class = "data.frame")
df2 <- structure(list(A = c("able", "baker", "carr"), B = c("whiskey",
"tango", "foxtrot"), C = list(14, c(2, 18, 32), c(10, 6)), D = list(
c(2, 18, 32), 14, c(10, 99)), E = list(c(2, 18, 32), c(10,
99), 14)), row.names = c(NA, -3L), class = "data.frame")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494890.html
上一篇:groupby迭代排序
下一篇:刮掉維基百科頁面的小節
