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

时间:2019-09-26 13:58:18

标签: r dataframe

我有2个数据框。第一个是调查工具(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

对于步骤1,我能想到的最好的方法如下。但是,这会将人口统计信息转换为NA,实际上有一些qo_id没有任何计分,这些qo_id也变为NA。

df <- df1*df2$scoring[match(names(df1), df2$qo_id)][col(df1)]

第2步问题:我想将结果添加到df1,所以看起来像这样。

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

对于第二部分,我有一个原始的rowSums解决方案,请参见下文,但是自动化的东西会很棒。

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

对此我非常菜鸟,非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

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

<div class="form-container">
<form action="" id="delete_reply">
  <input class="btn btn-link" value="reply">
  <input type="submit" class="btn btn-link" value="delete">
</form>
</div>