我创建了一个数据框my.df
,并希望根据几个条件选择行(或删除行)。对于这个示例数据框,我想保留第 1、2、4、7 和 8 行。具体来说,我想:
- 保留第 3、4 或 5 列中包含数字的任何行
- 如果第 1 列和第 2 列不是空白且不包含垃圾,则保留第 3-5 列中包含所有缺失观测值的任何行
我可以做到这一点,但我的解决方案似乎过于复杂,我希望有人可以提出更有效的方法。
my.df <- data.frame(C1 = c("group1", "group1", "", "", "junk", "junk", "group2", ""),
C2 = c( "A", "B", "", "", "", "junk", "B", "C"),
C3 = c( 100, NA, NA, 10, NA, NA, NA, NA),
C4 = c( 200, NA, NA, 20, NA, NA, 100, NA),
C5 = c( 100, NA, NA, 30, NA, NA, NA, 5))
my.df
# the number of missing observations in columns 3-5 is < 3 or
# when the number of missing observations in columns 3-5 is 3 neither column 1 nor 2 is either blank or 'junk'
df.2 <- my.df[ (rowSums(is.na(my.df[,3:5])) < (ncol(my.df)-2)) |
(rowSums(is.na(my.df[,3:5])) == (ncol(my.df)-2) & my.df[,1] != 'junk' & my.df[,2] != 'junk' & my.df[,1] != '' & my.df[,2] != '') , ]
df.2
根据我的实际数据,有资格成为垃圾的东西可能很复杂。所以,在这里我概括junk
为junk1
并且junk2
我仍然想保留第 1、2、4、7 和 8 行。下面的代码有效。
my.df <- data.frame(C1 = c("group1", "group1", "", "", "junk2", "junk1", "group2", ""),
C2 = c( "A", "B", "", "", "", "junk1", "B", "C"),
C3 = c( 100, NA, NA, 10, NA, NA, NA, NA),
C4 = c( 200, NA, NA, 20, NA, NA, 100, NA),
C5 = c( 100, NA, NA, 30, NA, NA, NA, 5))
my.df
df.3 <- my.df[ (rowSums(is.na(my.df[,3:5])) < (ncol(my.df)-2)) |
(rowSums(is.na(my.df[,3:5])) == (ncol(my.df)-2) &
my.df[,1] != 'junk1' & my.df[,2] != 'junk1' &
my.df[,1] != 'junk2' & my.df[,2] != 'junk2' &
my.df[,1] != '' & my.df[,2] != '')
, ]
df.3
因为有资格作为垃圾的字符串在这里变得非常多样化和复杂,所以我尝试使用 %in% 对垃圾进行分组来稍微简化代码,但我得到了一个错误。
all.junk <- c("", "junk1", "junk2")
my.df.1 <- my.df[,1]
my.df.2 <- my.df[,2]
my.df.1 <- as.character(my.df.1)
my.df.2 <- as.character(my.df.2)
df.4 <- my.df[ (rowSums(is.na(my.df[,3:5])) < (ncol(my.df)-2)) |
(rowSums(is.na(my.df[,3:5])) == (ncol(my.df)-2) &
my.df.1[!(my.df.1%in%all.junk)] & my.df.2[!(my.df.2%in%all.junk)]) , ]
df.4
我可以继续使用我拥有的功能代码,df.3
为每个符合垃圾标准的字符串添加一个新行,但我怀疑有一个更有效的解决方案。
我在 Stackoverflow 上发现了类似的问题,但我发现没有一个问题似乎与此示例中的选择标准一样多或复杂。
感谢您的任何建议,尤其是关于df.4
.