3我具有此功能:
nombre_points<-function(typeAction)
{
if(typeAction==1)
{return(4)}
else if (typeAction==2)
{return(3)}
else if (typeAction==3)
{return(2)}
}
我想将其应用于数据框的每一列
df>
ID 1 2 3
XX 0 1 2
YY 1 2 3
EE 2 2 1
ZZ 0 3 4
我想将上述功能应用于该数据帧,
nombre_points
函数是列的编号。
因此,我需要为每一行获取一个像这样的数据帧:
df>
ID Result
XX 7
YY 14
EE 16
ZZ 17
实际上对于观测ZZ例如17=0*4+3*3+4*2
同样对于XX观察,我们得到一个分数:7=0*4+3*1+2*2
我尝试使用apply
函数:
dd<-apply(df,1,nombre_points)
但是它没有给出所需的结果
答案 0 :(得分:2)
更新
因为,这些值可能与列号无关,所以我们可以创建一个命名向量或查找数据框来获取相应的值。
具有查找表:
named_df <- data.frame(col = c(1, 2, 3), value = c(4, 3, 2))
rowSums(df[-1] * named_df$value[col(df[-1])])
#[1] 7 16 16 17
具有命名向量:
named_vec <- c("1" = 4, "2" = 3, "3" = 2)
rowSums(named_vec[col(df[-1])] * df[-1])
#[1] 7 16 16 17
两种方法的逻辑相同,我们将列号与named_vec
的名称col
或named_df
匹配,并获得相应的值,然后将其乘以数据框中的实际值,然后使用rowSums
取每一行的总和。
原始答案
您可以将数据框中的每个值与其列号-1相乘,以获得所需的结果。在这里,df[-1]
将忽略第一列(ID
)。
df$result <- rowSums(df[-1] * (col(df) - 1))
df
# ID X1 X2 X3 result
#1 XX 0 1 2 5
#2 YY 1 2 3 8
#3 EE 2 2 1 4
#4 ZZ 0 3 4 11
出于理解目的,col(df)
给出
# [,1] [,2] [,3] [,4]
#[1,] 1 2 3 4
#[2,] 1 2 3 4
#[3,] 1 2 3 4
#[4,] 1 2 3 4