一个 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] == 1
、dfy [Q1_3]
返回为 dfz[Q1_3]
,否则返回 NA
或 dfx[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")
如您所见,您可以像连接数据库中的表一样连接数据框。
希望这对您有所帮助。
我有两个 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] == 1
、dfy [Q1_3]
返回为 dfz[Q1_3]
,否则返回 NA
或 dfx[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")
如您所见,您可以像连接数据库中的表一样连接数据框。
希望这对您有所帮助。