【问题标题】:Match/subset one dataframe based on conditional values in another dataframe in R根据 R 中另一个数据帧中的条件值匹配/子集一个数据帧
【发布时间】:2019-10-23 20:57:02
【问题描述】:

我有两个数据框:

df1=data.frame(A=c(1,2,4,8), B=c(4,3,2,9), C=c(10,11,1,2), D=c(12,40,3,4))
df2=data.frame(A=c(0.5,2.0,0.1,0.3), B=c(1.5,0.5,0.2,0.1), C=c(3.0,1.25,0.5,0.2), D=c(0.7,0.8,0.2,2.0))

我想在 df1 中为所有列保留 0.8 的列中保留 NAs

我试图在 df2 中查找和替换 > 0.8 的值:

df2[df2 >= 0.8] <- NA

然后我尝试用 df2 中的NA 替换 df1 中的所有匹配值,但类似于下面的脚本需要列而不是数据框:

df1[match(df1, df2==NA)] 

我希望最终的数据框如下所示:

df3=data.frame(A=c(1,NA,4,8), B=c(NA,3,2,9), C=c(NA,NA,1,2), D=c(12,40,3,NA))

TIA

【问题讨论】:

  • NA 不应被引用
  • @akrun 引号删除不能解决问题或回答问题
  • 您的预期输出与NA^(df2 &gt; 0.8) * df1提供的描述不匹配
  • @akrun 不想粗鲁,只是直截了当,引号没有任何帮助,将您的建议添加到可能的解决方案中可能会更有帮助。您对我想要的结果是正确的,所以我对其进行了编辑,感谢您指出。
  • 没关系。我提到,如果你犯了错误,引用NA 可能会在其他情况下导致一些问题

标签: r


【解决方案1】:

我们可以根据逻辑矩阵直接赋值NA

 NA^(df2 > 0.8) * df1

`is.na<-`(df1, df2 > 0.8)

【讨论】:

  • 这行得通,谢谢!此外,之前有人删除了一条同样有效的评论 df1[df2 > 0.8]
【解决方案2】:

像这样使用mapply

as.data.frame(mapply(function(x, y) ifelse(y <= 0.8, x, NA), df1, df2))

replace(df1, df2 > 0.8, NA)

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多