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"