Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果在人员输入样本之前允许NAs,如何删除包含NA的行?_R_Dataframe_Subset - Fatal编程技术网

R 如果在人员输入样本之前允许NAs,如何删除包含NA的行?

R 如果在人员输入样本之前允许NAs,如何删除包含NA的行?,r,dataframe,subset,R,Dataframe,Subset,我正在使用包含1-12年的面板数据集。如果一个人在第4年进入,他们的体重值将在第4年之前为NA。我只想在第4年后有任何NA值时删除此行 这个人应该被删除。因此,一旦一项观测在调查中被登记为活动观测,则不允许NA进行后续观测。除了权重,我还有其他变量列,所以我也需要对特定列执行此操作 我们可以使用base::rle检查NAs,然后在NAs发生一次或更少时进行筛选 flag<-apply(df[,grepl('^W',names(df))],1, function(x) sum(rle(is.

我正在使用包含1-12年的面板数据集。如果一个人在第4年进入,他们的体重值将在第4年之前为NA。我只想在第4年后有任何NA值时删除此行


这个人应该被删除。因此,一旦一项观测在调查中被登记为活动观测,则不允许NA进行后续观测。除了权重,我还有其他变量列,所以我也需要对特定列执行此操作

我们可以使用base::rle检查NAs,然后在NAs发生一次或更少时进行筛选

flag<-apply(df[,grepl('^W',names(df))],1, function(x) sum(rle(is.na(x))$values))
df[df$flag<=1,]
带apply using MARGIN=1行的选项

使用max.col,我们找到cols中第一个非NA值的索引,然后检查该行中是否有任何值在该索引之后有NA

资料

我添加了一些行以制作更好的示例

df <- structure(list(data = structure(1:4, .Label = c("Ind_1", "Ind_2", 
"Ind_3", "Ind_4"), class = "factor"), W_Y1 = c(NA, NA, NA, NA
), W_Y2 = c(NA, NA, NA, 23L), W_Y3 = c(NA, NA, NA, NA), W_Y4 = c(82L, 
82L, 82L, 82L), W_Y5 = c(81L, 81L, 81L, 81L), W_Y6 = c(83L, 83L, 
83L, 83L), W_Y7 = c(84L, 84L, NA, 84L), W_8 = c(NA, 65L, NA, 
12L), W_9 = c(86L, 86L, 86L, 86L)), class = "data.frame", row.names = c(NA, 
-4L))

df
#   data W_Y1 W_Y2 W_Y3 W_Y4 W_Y5 W_Y6 W_Y7 W_8 W_9
#1 Ind_1   NA   NA   NA   82   81   83   84  NA  86
#2 Ind_2   NA   NA   NA   82   81   83   84  65  86
#3 Ind_3   NA   NA   NA   82   81   83   NA  NA  86
#4 Ind_4   NA   23   NA   82   81   83   84  12  86
tidyverse解决方案:

library(tidyverse)

df %>%
  gather(year, weight, W_Y1:W_Y12) %>%
  group_by(data) %>%
  mutate(
    cond = max(which(is.na(weight))) < min(which(!is.na(weight))),
    year = year %>% reorder(str_extract(year, '\\d+') %>% as.numeric()) # just to keep right order of columns after 'spread()'
  ) %>%
  spread(year, weight) %>%
  filter(cond)

我有两个问题。保证金=1是什么意思?你用的是这个命令吗?我不明白,我也对使用grep的第一行感到困惑:变量名前面的“^”是什么意思?我的变量是fx r1srhlt-r12rsrhlt和r12diabets-r12diabetes。然后我会写:colsdiabetes@EmilKrabbe^意味着以开头,所以如果所有的权重列都以r开头,那么我所有的变量都命名为r1-r12。例如,我有r1height-r12height,还有r1weight-r12weight和r1bmi-R12BMI。那我该怎么办?是否有命令结尾?我的所有结尾都是特定于变量的。那么您希望选择哪个变量作为权重?在我的例子中,我用W_Y1,W_Y2作为权重。哪一个要考虑?r1高,r2高?或者有体重的人,或者有BMI的人,或者所有的人???@EmilKrabbe所以对于身高,首先要做cols which.max!is.nax,]然后对于重量,只需将cols改为cols,表示您有数据帧x aahh好的,我们通过R。我想堆栈溢出可以直接转换它。顺便说一句,我很快就会问一个关于Reforme2包中的melt命令的问题。我需要向数据集中添加一个时间变量,并将其从宽格式改为长格式。
df[mapply(function(x, y) !any(which(is.na(df[x, cols])) > y),1:nrow(df),
       max.col(!is.na(df[cols]), ties.method = "first")), ]
df <- structure(list(data = structure(1:4, .Label = c("Ind_1", "Ind_2", 
"Ind_3", "Ind_4"), class = "factor"), W_Y1 = c(NA, NA, NA, NA
), W_Y2 = c(NA, NA, NA, 23L), W_Y3 = c(NA, NA, NA, NA), W_Y4 = c(82L, 
82L, 82L, 82L), W_Y5 = c(81L, 81L, 81L, 81L), W_Y6 = c(83L, 83L, 
83L, 83L), W_Y7 = c(84L, 84L, NA, 84L), W_8 = c(NA, 65L, NA, 
12L), W_9 = c(86L, 86L, 86L, 86L)), class = "data.frame", row.names = c(NA, 
-4L))

df
#   data W_Y1 W_Y2 W_Y3 W_Y4 W_Y5 W_Y6 W_Y7 W_8 W_9
#1 Ind_1   NA   NA   NA   82   81   83   84  NA  86
#2 Ind_2   NA   NA   NA   82   81   83   84  65  86
#3 Ind_3   NA   NA   NA   82   81   83   NA  NA  86
#4 Ind_4   NA   23   NA   82   81   83   84  12  86
library(tidyverse)

df %>%
  gather(year, weight, W_Y1:W_Y12) %>%
  group_by(data) %>%
  mutate(
    cond = max(which(is.na(weight))) < min(which(!is.na(weight))),
    year = year %>% reorder(str_extract(year, '\\d+') %>% as.numeric()) # just to keep right order of columns after 'spread()'
  ) %>%
  spread(year, weight) %>%
  filter(cond)