一个 df 中的子集值基于另一个 df 中的值

subset values in a df based on values in another df

我有两个 dfs,都很暗 [1] 54 210。一个(让我们称之为 dfx)包含 1、0 来标记测试中的错误和正确答案。 dfy 包含每个问题的回答时间。我想子集(merge()(可能)来自 dfy 的所有项目在 dfx 中 == 1。数据采用宽格式,ID = rownames 和列代表每个问题。

示例:

dfx

Q1 Q2 Q3 Q4 Q5 …
1  1  1  1  1
1  1  1  1  1
1  1  0  1  1 
1  1  0  1  1 

Dfy

Q1_3 Q2_3  Q3_3  Q4_3  Q5_3 ...
16.01 8.23 18.13 11.14 18.03
17.25 7.50 11.72 10.84  7.24

我需要一个作为 dfy 子集的 dfz,其中如果 dfx[Q1] == 1dfy [Q1_3] 返回为 dfz[Q1_3],否则返回 NAdfx[Q1](即 0)。

如果我通过

指定 cols 就可以做到
dfz<- cbind(ifelse(dfx$Q1 == 1, dfy$Q1_3, dfx$Q1))

但是我不知道如何将它应用于整个 df。

有什么想法吗?

如果两个数据框的大小相同,并且dfx只有1和0,你可以将它们相乘得到你需要的:

dfz <- dfy * dfx

在您的下一条评论中,您询问如何根据其他数据框的值操作数据框中的列。对于这种事情,我经常使用 sqldf package。它让您使用 SQL 指令操作数据帧。您需要一些 id 列来关联您的数据框。

一个简单的例子:

library(sqldf)
sqldf("select df_a.id
            , case
                  when df_b.q1 = 1 then df_a.q1
                  else 0
              end as value
       from df_a
            inner join df_b on df_a.id = df_b.id")

如您所见,您可以像连接数据库中的表一样连接数据框。

希望这对您有所帮助。