我正在尝试应用一个自定义函数,该函数调用该数据框的组件进行计算。我在下面做了一个琐碎的例子,因为我的实际问题很难做出可复制的例子。在下面的示例中,我希望将前两列加在一起以创建第三列,即它们的总和。下面是我在网上找到的一个接近我想要的示例:
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 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
答案 0 :(得分:2)
对于请求的特定任务,可能是
+
apply
函数本身是矢量化的。将sum
与apply
一起使用效率低下。通过省略第一列可以大大简化 celebrities$newcol <- apply(celebrities[-1], function(x) sum(x) )
的使用,因为这样可以避免强制转换为由第一列引起的字符矩阵。
numeric
这样,您就可以避免将向量强制转换为“字符”,然后需要将之前的数字列强制转换回sum
。在内部套用?Ops
可以避免未对矢量求和的事实,但这是R编码效率低下的一个例子。
如果“内部”算法可以完全由矢量化函数构造而成,则将获得自动矢量化:Math和Ops组是通常的组件。参见mapply
。否则,您可能需要使用Vectorize
或127.0.0.1:27017 (Master)
127.0.0.1:27018 (Slave)
127.0.0.1:27019 (Arbiter)
My replica name is "xdr"
。
答案 1 :(得分:1)
从@ r2evans和@ user2738526获得提示我已经对您的函数进行了修改。 将数字显式转换为数字。 以下代码段适用于您的情况:
f2=function(x,output){
age=as.numeric(x[2])
income=as.numeric(x[3])
sum(age,income)
}
apply(celebrities,1,f2)
[1] 53.2 33.5 60.0 50.9 82.0 34.5 74.0
答案 2 :(得分:1)
尝试一下:
library(dplyr)
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))
celebrities %>%
rowwise %>%
mutate(age_plus_income = sum(age, income))
(很明显,要求两列的总和,最好使用mutate(celebrities, age_plus_income = age + income)
,但我认为您的实际示例使用的是更复杂的函数。)