Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索R数据框中所有列的值_R_Dataframe_Data.table_Dplyr - Fatal编程技术网

搜索R数据框中所有列的值

搜索R数据框中所有列的值,r,dataframe,data.table,dplyr,R,Dataframe,Data.table,Dplyr,这是一个示例数据帧 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

这是一个示例数据帧

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
数据。可接受表
解决方案


谢谢。

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

df[rowSums(df[-1] == 1.0) != 0, 'company']
[1] b d
Levels: a b c d
var%select(债券:现金)%%>%name
plyr::ldply(变量,函数(x)粘贴(“过滤器(df,,,x,==1)”)%%>%parse(文本=)%%>%eval)
公司债券股本现金
1b100
2 d 0 1 0
另一个选项:

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

我们还可以使用
减少
=

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

res顺便说一句……你能分享一下如何搜索非数字列吗?你是说每列的过滤条件不同吗?我认为这种方法不适用于那种情况。无论如何,您需要更具体地了解列和条件是什么。仅供参考,检查浮点数是否相等是一项容易出错的工作。试着看看
x=(.1+.2)*(10/3)
,然后测试
x==1
…Fwiw,这个问题有一些变化:我认为akrun的方法是
df[!!行和(df==1),]
:)@pierrelaffortune是的,你是对的,但有人已经发布了带有
行和的解决方案,所以我不想就剽窃问题争吵:-)@pierrelaffortune-在这种情况下,是的,但我认为如果多列中有一个1,就需要唯一性。
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