根据其列号为每行应用一个函数

时间:2018-10-02 08:19:41

标签: r

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)

但是它没有给出所需的结果

1 个答案:

答案 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的名称colnamed_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