假设我有一个包含列c1,...,cn的数据框,以及一个将此数据框的列作为参数接收的函数f。 如何将f应用于数据帧的每一行以获得新的数据帧?
例如,
x = data.frame(letter=c('a','b','c'), number=c(1,2,3))
# x is
# letter | number
# a | 1
# b | 2
# c | 3
f = function(letter, number) { paste(letter, number, sep='') }
# desired output is
# a1
# b2
# c3
我该怎么做?我猜它是{s,l,t}应用(x,f)的行,但我无法弄明白。
答案 0 :(得分:11)
正如@greg指出的那样,paste()可以做到这一点。我怀疑你的例子是一个更普遍的问题的简化。在过去挣扎之后,as illustrated in this previous question,我最终使用plyr包进行此类事情。普利尔做得更多,但对于这些事情很容易:
> require(plyr)
> adply(x, 1, function(x) f(x$letter, x$number))
X1 V1
1 1 a1
2 2 b2
3 3 c3
你想要重命名输出列,我确定
因此,当我输入此内容时,@ joshua使用ddply
显示了另一种方法。我的例子中的不同之处在于adply
将输入数据帧视为数组。 adply
不使用@joshua创建的“group by”变量row
。他是怎么做到的,这正是我在做这件事之前,直到哈德利向我提出adply()
方法。在上述问题中。
答案 1 :(得分:7)
paste(x$letter, x$number, sep = "")
答案 2 :(得分:1)
我认为您正在考虑这样的事情,但请注意apply
系列函数不返回data.frames。在应用函数之前,他们还会尝试将data.frame强制转换为矩阵。
apply(x,1,function(x) paste(x,collapse=""))
因此,您可能对ddply
包中的plyr
更感兴趣。
> x$row <- 1:NROW(x)
> ddply(x, "row", function(df) paste(df[[1]],df[[2]],sep=""))
row V1
1 1 a1
2 2 b2
3 3 c3