【问题标题】:Search values across all columns in R data frame在 R 数据框中的所有列中搜索值
【发布时间】:2016-10-31 13:30:18
【问题描述】:

这是一个示例数据框。

df = data.frame(company = c('a', 'b', 'c', 'd'),
                 bond = c(0.2, 1, 0.3, 0),
                 equity = c(0.7, 0, 0.5, 1),
                 cash = c(0.1, 0, 0.2, 0))
df

  company bond equity cash
1       a  0.2    0.7  0.1
2       b  1.0    0.0  0.0
3       c  0.3    0.5  0.2
4       d  0.0    1.0  0.0

我需要找到在任何列中都有 1.0 的公司。 预期结果应该是 b 和 d

请提供适用于 >20 列的解决方案。 df %>% filter(bond == 1) 之类的解决方案仅适用于搜索特定列。

dplyrdata.table 解决方案是可以接受的。

谢谢。

【问题讨论】:

标签: r dataframe data.table dplyr


【解决方案1】:

使用rowSums检查逻辑数据框是否正常工作:

df[rowSums(df[-1] == 1.0) != 0, 'company']
[1] b d
Levels: a b c d

【讨论】:

  • 顺便说一句……您能分享一下您将如何搜索非数字列吗?
  • 您的意思是每列的过滤条件不同吗?我认为这种方法不适用于这种情况。无论如何,您需要更具体地了解列和条件是什么。
【解决方案2】:

另一种选择:

df[unique(row(df[-1])[df[-1] == 1L]),]
#  company bond equity cash
#2       b    1      0    0
#4       d    0      1    0

df$company[unique(row(df[-1])[df[-1] == 1L])]
#[1] b d
#Levels: a b c d

【讨论】:

  • @PierreLafortune - 在这种情况下,是的,但我认为如果多列中有 1,则需要唯一性。
【解决方案3】:

我们也可以使用Reduce==

res <- df[Reduce(`+`, lapply(df[-1], `==`, 1))!=0,]
res
#   company bond equity cash
#2       b    1      0    0
#4       d    0      1    0

res$company
#[1] b d
#Levels: a b c d

【讨论】:

  • 我认为akrun的方式是df[!!rowSums(df==1),] :)
  • @PierreLafortune 是的,你是对的,但有人已经用rowSums 发布了解决方案,所以我不想卷入关于抄袭的争论:-)
【解决方案4】:
var <- df %>% select(bond:cash) %>% names
plyr::ldply(var, function(x) paste("filter(df,", x, "==1)") %>% parse(text=.) %>% eval)
  company bond equity cash
1       b    1      0    0
2       d    0      1    0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2017-09-09
    • 2012-08-16
    相关资源
    最近更新 更多