考虑这个例子:
df <- data.frame(id=1:10,var1=LETTERS[1:10],var2=LETTERS[6:15])
fun.split <- function(x) tolower(as.character(x))
df$new.letters <- apply(df[ ,2:3],2,fun.split)
df$new.letters.var1
#NULL
colnames(df)
# [1] "id" "var1" "var2" "new.letters"
df$new.letters
# var1 var2
# [1,] "a" "f"
# [2,] "b" "g"
# [3,] "c" "h"
# [4,] "d" "i"
# [5,] "e" "j"
# [6,] "f" "k"
# [7,] "g" "l"
# [8,] "h" "m"
# [9,] "i" "n"
# [10,] "j" "o"
会有这么好心的人解释一下这里发生了什么吗?数据框中的新数据框?
我期待这个:
colnames(df)
# id var1 var2 new.letters.var1 new.letters.var2
最佳答案
原因是因为您将一个新列分配给了 2 列 matrix
输出 apply
.所以,结果将是 matrix
在单个列中。您可以将其转换回正常的 data.frame
do.call(data.frame, df)
更直接的方法是分配 2 列,我使用
lapply
而不是 apply
因为可能存在列属于不同类别的情况。 apply
返回 matrix
对于混合类,列将是“字符”类。但是,lapply
在 list
中获取输出并保留 class
df[paste0('new.letters', names(df)[2:3])] <- lapply(df[2:3], fun.split)
关于r - 数据帧内的数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30896605/