R将基于标题名的列与第二个数据帧中的值相乘
我有两个数据帧。第一个是调查工具(df1)的输出,第二个包含评分/图例(df2)。df1包含一些人口统计信息和大约360个“问题结果id”(qo_id=qo1~qo360),每个都是0或1。df1是动态的,因此列的顺序可以更改。df2包含每个qo_id的得分。实际输出实际上是一个或多个特定“qo_id”的总和 df1格式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
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