【发布时间】:2018-12-20 04:52:15
【问题描述】:
我正在尝试应用一个自定义函数,该函数调用该数据框的组件来进行计算。我在下面做了一个简单的例子,因为我的实际问题很难做一个可重现的例子。在下面的示例中,我希望将前两列加在一起以创建第三列,这是它们的总和。下面是我在网上找到的一个与我想要的很接近的例子:
celebrities=data.frame(name=c("Andrew","matt","Dany","Philip","John","bing","Monica"),
age=c(28,23,49,29,38,23,29),
income=c(25.2,10.5,11,21.9,44,11.5,45))
f=function(x,output){
name=x[1]
income=x[3]
cat(name,income,"\n")
}
apply(celebrities,1,f)
但是当我尝试使用它并应用数学函数时它不起作用:
f2=function(x,output){
age=x[2]
income=x[3]
sum(age,income)
}
apply(celebrities,1,f2)
本质上,我需要的是 apply 获取数据集,使用该行中的值作为函数的输入遍历该数据集的每一行,然后将第三列添加到数据集以及函数的结果。如果需要,请告诉我如何澄清这个问题。我已经提到了以下问题,但它们似乎对我不起作用。
Apply a function to every row of a matrix or a data frame
How to assign new values from lapply to new column in dataframes in list
Call apply-like function on each row of dataframe with multiple arguments from each row
【问题讨论】:
-
当您在
data.frame上使用apply时,会将其转换为matrix以进行处理。如果(已处理帧的)任何列是character,则所有列都将转换为character,从而使任何数学运算失效。虽然我倾向于不鼓励apply使用框架,但如果您必须确保只使用其中的一部分,例如apply(celebrities[c("age","income")], 1, sum)。 -
您可以尝试使用
library(plyr)中的某些内容,例如adply或aaply(取决于您希望输出格式是什么样的),它们不会将所有列强制转换为character -
我相信
dplyr现在有一个rowwise函数可以帮助你做你想做的事。例如,library(dplyr) ; celebrities %>% rowwise %>% mutate(new_var = f(var1, var2))
标签: r vectorization apply lapply