R 使用空单元格跨多个列进行子集设置
我有一个很大的数据集,其中每一行可能有一个包含文本的单元格,而其余的单元格是空的。是否有一种方法可以将这些行子集为只在给定列中包含文本的行,而其余行为空 我知道我可以使用例如R 使用空单元格跨多个列进行子集设置,r,multiple-columns,subset,R,Multiple Columns,Subset,我有一个很大的数据集,其中每一行可能有一个包含文本的单元格,而其余的单元格是空的。是否有一种方法可以将这些行子集为只在给定列中包含文本的行,而其余行为空 我知道我可以使用例如tmp[tmp$A!=“”&tmp$B=“”&tmp$C=“”&tmp$D=“”,],但由于我有大约30个列,我想为每个列运行此操作,这将是相当乏味的。我尝试了以下方法,但效果不符合预期 tmp=data.frame(A=c("a","","","",""), B=c("","b","","","")
tmp[tmp$A!=“”&tmp$B=“”&tmp$C=“”&tmp$D=“”,]
,但由于我有大约30个列,我想为每个列运行此操作,这将是相当乏味的。我尝试了以下方法,但效果不符合预期
tmp=data.frame(A=c("a","","","",""),
B=c("","b","","",""),
C=c("","","c","",""),
D=c("","","","D",""))
#Attempting subsetting across multiple columns with tmp[,2:3]
tmp[tmp[,1]!="" & tmp[,2:3]=="",]
A B C D
1 a
NA <NA> <NA> <NA> <NA>
#But it results in creating rows with na
tmp[tmp[,1]!="" & tmp[,2:4]=="",]
A B C D
1 a
NA <NA> <NA> <NA> <NA>
NA.1 <NA> <NA> <NA> <NA>
然后将在ifelse()
中使用,这样,如果列A中只有带文本的单元格,则为列E提供文本A,如果列B中只有文本,则为列E提供文本B
A B C D E
a A
b B
c C
d D
建议?在示例数据帧中,字符向量被转换为因子,因此您可以通过在示例数据帧中使用
stringsAsFactors=FALSE
来删除R的默认行为
tmp=data.frame(A=c("a","","","",""),
B=c("","b","","",""),
C=c("","","c","",""),
D=c("","","","D",""),stringsAsFactors=FALSE)
然后你可以得到你想要的:
kk<-tmp[tmp[,1]!="",]
> kk
A B C D
1 a
ll<-tmp[tmp[,2]!="",]
> ll
A B C D
2 b
tmp[1:4,"E"]<-names(is.na(c(tmp)))
tmp
A B C D E
1 a A
2 b B
3 c C
4 D D
5 <NA>
na.omit(tmp)
A B C D E
1 a A
2 b B
3 c C
4 D D
所以
因此,您需要使用levels(tmp[,1])==“”
查看
完成。案例
@Justin,看不出这对我的案例有什么帮助。@Henrik,好建议,但不适用于我的案例。我详细阐述了我的问题,以使其更易于理解…很抱歉回答得太晚,但非常感谢您的帮助:)嗯..我似乎无法在非二次数据帧(即行多于列)上执行此操作。您的示例数据有5行和4列。代码在这里工作,可能它应该在您的真实数据中工作。我的框架是82820行22列(看起来很糟糕,但我没有做到:P),如果感兴趣,可以在这里使用:您需要先尝试使用50行22列。如果这行得通,我想不会有问题
kk<-tmp[tmp[,1]!="",]
> kk
A B C D
1 a
ll<-tmp[tmp[,2]!="",]
> ll
A B C D
2 b
tmp[1:4,"E"]<-names(is.na(c(tmp)))
tmp
A B C D E
1 a A
2 b B
3 c C
4 D D
5 <NA>
na.omit(tmp)
A B C D E
1 a A
2 b B
3 c C
4 D D
str(tmp)
'data.frame': 5 obs. of 4 variables:
$ A: Factor w/ 2 levels "","a": 2 1 1 1 1
$ B: Factor w/ 2 levels "","b": 1 2 1 1 1
$ C: Factor w/ 2 levels "","c": 1 1 2 1 1
$ D: Factor w/ 2 levels "","D": 1 1 1 2 1
levels(tmp[,1])
[1] "" "a"