根据R中的相同条件筛选多个列
我有一个数据框,其中有多个列(超过30个)保存在一个列表中。我希望对所有这些列应用相同的标准,而不必为每一列编写代码。下面的例子有助于更好地理解我的问题根据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(
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]
答案很好。在我的情况下,我是在所有变量
而不是任何变量
答案很好。在我的情况下,我是在所有变量
而不是任何变量