【问题标题】:subset values in a df based on values in another df基于另一个 df 中的值的 df 中的子集值
【发布时间】:2016-02-29 20:24:21
【问题描述】:

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

例子:

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。

有什么想法吗?

【问题讨论】:

  • 您的数据框中是否有唯一标识符(我的意思是,就像 id 列,让您可以将 dfx 中的每一行与 dfy 中的一行进行匹配)?或者,您是否确保两个数据帧的行顺序匹配?
  • @Barranka :我可以插入一个 id 列,但是两个 dfs 的 rownames ==
  • 它可以像dfy * dfx 这样简单。如果 dfx 只有 1 和 0,则两者的乘积将返回 0 表示不正确的答案,dfy 的值表示正确的答案。
  • OMG @Barranka :) 确实解决了我的问题,是的 :) 但是,你知道如何将这个:dfz&lt;- cbind(ifelse(dfx$Q1 == 1, dfy$Q1_3, dfx$Q1)) 转换为一个函数,以便我可以根据另一个值操作 dfs 吗?
  • 检查我的答案...它可能会帮助你(它包括我上面的评论,所以如果你愿意,你可以投票或接受它)

标签: r function if-statement dataframe subset


【解决方案1】:

如果两个数据框的大小相同,并且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")

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

希望这会有所帮助。

【讨论】:

  • 这真的很有意义。我刚刚开始熟悉 R,我不会做 SQL,但我看到了其中的逻辑。非常感谢:)
  • @CsabaSzavo 很高兴为您提供帮助。有很多学习 R 的在线资源。我推荐你The Quick-R Tutorial。 (顺便说一句,如果您认为此答案有用,请投票和/或接受它;-))
  • 还不能投票,但我接受了答案... :) 谢谢
猜你喜欢
  • 1970-01-01
  • 2019-12-22
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2023-01-09
  • 2020-09-16
  • 2016-09-19
相关资源
最近更新 更多