我已经创建了一个数据框
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
的错误。