这是一个示例数据框。
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)
这样的解决方案仅适用于搜索特定列。
dplyr
或data.table
解决方案可以接受。
感谢。
答案 0 :(得分:4)
使用rowSums
检查逻辑数据框是否应该起作用:
df[rowSums(df[-1] == 1.0) != 0, 'company']
[1] b d
Levels: a b c d
答案 1 :(得分:4)
另一种选择:
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
答案 2 :(得分:4)
我们也可以将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
答案 3 :(得分:1)
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