删除R中的连续空行

删除R中的连续空行,r,missing-data,data-manipulation,R,Missing Data,Data Manipulation,df显示可能的名称匹配。每对匹配项都应该被一个空行分割。但是,在某些情况下,我的输出包括匹配对之间的几行空行: > df <- data.frame(id = c(1,2,NA,3,4,NA,NA,NA,5,6,NA), name = c("john jones", "john joners", NA, "clara prat", "klara prat", NA, NA, NA, "alan turing", "allan turing",

df
显示可能的名称匹配。每对匹配项都应该被一个空行分割。但是,在某些情况下,我的输出包括匹配对之间的几行空行:

> df <- data.frame(id = c(1,2,NA,3,4,NA,NA,NA,5,6,NA), name = c("john jones", "john joners", 
                   NA, "clara prat", "klara prat", NA, NA, NA, "alan turing", "allan turing", 
                   NA), stringsAsFactors = F)
> df
   id         name
1   1   john jones
2   2  john joners
3  NA         <NA>
4   3   clara prat
5   4   klara prat
6  NA         <NA>
7  NA         <NA>
8  NA         <NA>
9   5  alan turing
10  6 allan turing
11 NA         <NA>
>测向
身份证名称
1约翰·琼斯
2约翰·乔纳斯
3 NA
4.3克拉拉·普拉特
5.4克拉普拉特
6 NA
7 NA
8 NA
9.5艾伦·图灵
10 6艾伦图灵
11 NA
所需输出为:

> df
   id         name
1   1   john jones
2   2  john joners
3  NA         <NA>
4   3   clara prat
5   4   klara prat
6  NA         <NA>
7   5  alan turing
8   6 allan turing
9  NA         <NA>
>df
身份证名称
1约翰·琼斯
2约翰·乔纳斯
3 NA
4.3克拉拉·普拉特
5.4克拉普拉特
6 NA
7.5艾伦·图灵
8.6艾伦图灵
9 NA
我可以用for循环来实现这一点,我知道这不是最优的

也许这有帮助

v1 <- rowSums(!is.na(df))
df[unlist(lapply(split(seq_along(v1),
     cumsum(c(1, diff(!v1))<0)), function(i) 
                    i[seq(which.max(v1[i]==0))])),]
#   id         name
#1   1   john jones
#2   2  john joners
#3  NA         <NA>
#4   3   clara prat
#5   4   klara prat
#6  NA         <NA>
#9   5  alan turing
#10  6 allan turing
#11 NA         <NA>

v1使用
IRanges
软件包

df <- data.frame(id = c(1,2,NA,3,4,NA,NA,NA,5,6,NA), name = c("john jones", "john joners", 
                  NA, "clara prat", "klara prat", NA, NA, NA, "alan turing", "allan turing", 
                                         NA), stringsAsFactors = F)

library(IRanges)
na.rs <- which(is.na(df$id) & is.na(df$name))
na.rs.re <- reduce(IRanges(na.rs, na.rs))
na.rs.rm <- na.rs.re[width(na.rs.re)>1]
start(na.rs.rm) <- start(na.rs.rm) + 1

df[-as.integer(na.rs.rm), ]
#    id         name
# 1   1   john jones
# 2   2  john joners
# 3  NA         <NA>
# 4   3   clara prat
# 5   4   klara prat
# 6  NA         <NA>
# 9   5  alan turing
# 10  6 allan turing
# 11 NA         <NA>

df这里是另一种使用
rle
查找缺少的

miss <- rowSums(is.na(df))

# get runs of missing 
r <- rle(miss)
r$values <- seq_along(r$values)

# subset data, removing rows when all columns are missing 
# and rows sequentially missing
df[!(miss == ncol(df) & duplicated(inverse.rle(r))), ]
#   id         name
# 1   1   john jones
# 2   2  john joners
# 3  NA         <NA>
# 4   3   clara prat
# 5   4   klara prat
# 6  NA         <NA>
# 9   5  alan turing
# 10  6 allan turing
# 11 NA         <NA>

当然不是最好的解决方案,但很容易遵循

miss <- rowSums(is.na(df))
r <- sum(rle(miss)[[2]])

 for(i in 2:length(df$id)){
  while(is.na(df$id[i-1]) & is.na(df$id[i])){
   df <- df[-(i),] 
  if(sum(is.na(df$id)) == r) break
  }
 }

错过您尝试过的内容,期望的结果是什么?您是否只需要相同的df而不需要第7行和第8行?您想要的最终输出是什么?如果只有一行有NAs,而周围的行没有,该怎么办?如果一行中的一个变量是NA,而其他变量不是NA呢?请根据示例显示所需输出。已添加所需输出。我希望每一对整行之间都有空行。根据设计,一行要么是完全完整的,要么是完全空的。希望这能让问题更清楚。我也在考虑
rle
。这看起来不错。干杯,阿克伦:我仍然认为我错过了一个简化它的窍门。你可能会想出一个很好的数据表版本。你也可以尝试使用
rleid
,但我还有一些其他头疼的问题要解决。哈哈,那就别做那么多了!!(我天真的dt方法:
dt感谢user20650和@akrun的建议。它工作得非常好。
miss <- rowSums(is.na(df))
r <- sum(rle(miss)[[2]])

 for(i in 2:length(df$id)){
  while(is.na(df$id[i-1]) & is.na(df$id[i])){
   df <- df[-(i),] 
  if(sum(is.na(df$id)) == r) break
  }
 }