Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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_Data.table_Apply - Fatal编程技术网

根据R中的相同条件筛选多个列

根据R中的相同条件筛选多个列,r,data.table,apply,R,Data.table,Apply,我有一个数据框,其中有多个列(超过30个)保存在一个列表中。我希望对所有这些列应用相同的标准,而不必为每一列编写代码。下面的例子有助于更好地理解我的问题 A<-c("A","B","C","D","E","F","G","H","I") B<-c(0,0,0,1,2,3,0,0,0) C<-c(0,1,0,0,1,2,0,0,0) D<-c(0,0,0,0,1,1,0,1,0) E<-c(0,0,0,0,0,0,0,1,0) data<-data.frame(

我有一个数据框,其中有多个列(超过30个)保存在一个列表中。我希望对所有这些列应用相同的标准,而不必为每一列编写代码。下面的例子有助于更好地理解我的问题

A<-c("A","B","C","D","E","F","G","H","I")
B<-c(0,0,0,1,2,3,0,0,0)
C<-c(0,1,0,0,1,2,0,0,0)
D<-c(0,0,0,0,1,1,0,1,0)
E<-c(0,0,0,0,0,0,0,1,0)
data<-data.frame(A,B,C,D,E)
并得到以下结果

   A B C D E
1: B 0 1 0 0
2: D 1 0 0 0
3: E 2 1 1 0
4: F 3 2 1 0
5: H 0 0 1 1

但是,有没有一种方法可以获得上述答案,而无需编写每个单独的列标准(例如,B>=1 | C>=1…),因为我在实际数据中有30多个列。非常感谢您提供了一个具体的示例来检查行中是否至少有一个值至少为1,您可以使用
rowSums

data[rowSums(data[,-1]) > 0, ]
#   A B C D E
# 2 B 0 1 0 0
# 4 D 1 0 0 0 
# 5 E 2 1 1 0
# 6 F 3 2 1 0
# 8 H 0 0 1 1

如果您有其他的标准,您不妨考虑<代码> < <代码> > <代码<应用> <代码> < /p>

ind <- apply(data[,-1], 1, function(x) {any(x >= 1)})
data[ind,]
#   A B C D E
# 2 B 0 1 0 0
# 4 D 1 0 0 0 
# 5 E 2 1 1 0
# 6 F 3 2 1 0
# 8 H 0 0 1 1
ind=1)})
数据[ind,]
#A、B、C、D、E
#2B0100
#4d1000
#5 E 2 11 0
#6 F 3 2 1 0
#8h001

对于检查行中是否至少有一个值至少为1的特定示例,您可以使用
行和

data[rowSums(data[,-1]) > 0, ]
#   A B C D E
# 2 B 0 1 0 0
# 4 D 1 0 0 0 
# 5 E 2 1 1 0
# 6 F 3 2 1 0
# 8 H 0 0 1 1

如果您有其他的标准,您不妨考虑<代码> < <代码> > <代码<应用> <代码> < /p>

ind <- apply(data[,-1], 1, function(x) {any(x >= 1)})
data[ind,]
#   A B C D E
# 2 B 0 1 0 0
# 4 D 1 0 0 0 
# 5 E 2 1 1 0
# 6 F 3 2 1 0
# 8 H 0 0 1 1
ind=1)})
数据[ind,]
#A、B、C、D、E
#2B0100
#4d1000
#5 E 2 11 0
#6 F 3 2 1 0
#8h001

您可以始终使用
Reduce
,这很好,因为您可以将任何类型的逻辑放入函数中:

一个简单的方法可能是:

data[Reduce("|", as.data.frame(data[,list] >= 1)),]
#  A B C D E
#2 B 0 1 0 0
#4 D 1 0 0 0
#5 E 2 1 1 0
#6 F 3 2 1 0
#8 H 0 0 1 1
一点说明:
Reduce
将相同的函数依次应用于
x
的每个元素。在这种情况下,“|”运算符应用于
data.frame
的每个逻辑列


如果您想进行更复杂的逻辑检查,可以使用自己的匿名函数进行检查。

您可以始终使用
Reduce
,这很好,因为您可以将任何类型的逻辑放入函数中:

一个简单的方法可能是:

data[Reduce("|", as.data.frame(data[,list] >= 1)),]
#  A B C D E
#2 B 0 1 0 0
#4 D 1 0 0 0
#5 E 2 1 1 0
#6 F 3 2 1 0
#8 H 0 0 1 1
一点说明:
Reduce
将相同的函数依次应用于
x
的每个元素。在这种情况下,“|”运算符应用于
data.frame
的每个逻辑列


如果你想做更复杂的逻辑检查,你可以用你自己的匿名函数来做。

dplyr::filter\u at
就可以做到这一点

library(dplyr)
data %>% filter_at(vars(-A),any_vars(.>=1))
#   A B C D E
# 1 B 0 1 0 0
# 2 D 1 0 0 0
# 3 E 2 1 1 0
# 4 F 3 2 1 0
# 5 H 0 0 1 1

dplyr::filter\u at
就可以做到这一点

library(dplyr)
data %>% filter_at(vars(-A),any_vars(.>=1))
#   A B C D E
# 1 B 0 1 0 0
# 2 D 1 0 0 0
# 3 E 2 1 1 0
# 4 F 3 2 1 0
# 5 H 0 0 1 1

请使用R中的
apply
检查此项

B<-c(0,0,0,1,2,3,0,0,0)
C<-c(0,1,0,0,1,2,0,0,0)
D<-c(0,0,0,0,1,1,0,1,0)
ef=data.frame(B,C,D)
con=apply(ef,2,function(x) x>1 )

B请使用R中的
apply
检查此项

B<-c(0,0,0,1,2,3,0,0,0)
C<-c(0,1,0,0,1,2,0,0,0)
D<-c(0,0,0,0,1,1,0,1,0)
ef=data.frame(B,C,D)
con=apply(ef,2,function(x) x>1 )

B获取有用信息可能重复获取有用信息可能重复获取更多数据。表方式非常类似,来自akrun:
data[data[,Reduce(
,lappy(.SD,
=
,1)),.SDcols=list]
更多数据。表方式非常类似,来自akrun:
data[data],Reduce(
,lappy>)(.SD,
=
,1)),.SDcols=list]
答案很好。在我的情况下,我是在
所有变量
而不是
任何变量
答案很好。在我的情况下,我是在
所有变量
而不是
任何变量