R将基于标题名的列与第二个数据帧中的值相乘

R将基于标题名的列与第二个数据帧中的值相乘,r,dataframe,R,Dataframe,我有两个数据帧。第一个是调查工具(df1)的输出,第二个包含评分/图例(df2)。df1包含一些人口统计信息和大约360个“问题结果id”(qo_id=qo1~qo360),每个都是0或1。df1是动态的,因此列的顺序可以更改。df2包含每个qo_id的得分。实际输出实际上是一个或多个特定“qo_id”的总和 df1格式 user_id age gender qo354 qo355 qo356 qo19 qo65 qo98 abc 34 f 1 0 0

我有两个数据帧。第一个是调查工具(df1)的输出,第二个包含评分/图例(df2)。df1包含一些人口统计信息和大约360个“问题结果id”(qo_id=qo1~qo360),每个都是0或1。df1是动态的,因此列的顺序可以更改。df2包含每个qo_id的得分。实际输出实际上是一个或多个特定“qo_id”的总和

df1格式

user_id age  gender  qo354 qo355 qo356 qo19 qo65 qo98
abc     34   f       1     0     0     0    1    1
def     40   m       0     1     0     0    0    1
ghi     28   f       0     0     1     1    1    0
df2格式

qo_id scoring outcome
qo354 -1      out4
qo355 0       out4
qo356 1       out4
qo19  1       out15
qo65  2       out21
qo98  1       out15
步骤1问题:我想将每个qo_id(其中qo_id=1)与各自的得分相乘

user_id age  gender  qo354 qo355 qo356 qo19 qo65 qo98
abc     34   f       -1    0     0     0    2    1
def     40   m       0     0     0     0    0    1
ghi     28   f       0     0     1     1    2    0
对于第一步,我能想到的最好的东西是下面的内容。然而,它将人口统计信息转换为NA,实际上有些qo_id没有任何得分,这些也会转换为NA

df <- df1*df2$scoring[match(names(df1), df2$qo_id)][col(df1)]
对于第二部分,我有一个原始的行和解决方案,请参见下文,但是自动化的东西会很好

df1$out4<- rowSums(df1[, c("qo354", "qo355", "qo356")])
df1$out15<- rowSums(df1[, c("qo19", "qo98")])
df1$out21<- rowSums(df1[, c("qo21")])

df1$out4解决第一个问题的一种可能性:

data.frame(df1[1:3],
           sweep(df1[4:length(df1)], 2, setNames(df2$scoring, df2$qo_id), "*"))

  user_id age gender qo354 qo355 qo356 qo19 qo65 qo98
1     abc  34      f    -1     0     0    0    2    1
2     def  40      m     0     0     0    0    0    1
3     ghi  28      f     0     0     1    1    2    0
你看过这个网站吗?我认为你的问题与你的数据组织方式有关。如果您尝试使用“整洁”的数据集,那么所有数据操作都会容易得多。(很抱歉这么多更新我的评论,我还不习惯评论)
data.frame(df1[1:3],
           sweep(df1[4:length(df1)], 2, setNames(df2$scoring, df2$qo_id), "*"))

  user_id age gender qo354 qo355 qo356 qo19 qo65 qo98
1     abc  34      f    -1     0     0    0    2    1
2     def  40      m     0     0     0    0    0    1
3     ghi  28      f     0     0     1    1    2    0