我有一个庞大的数据集,其中包含提交每月调查的ID,我知道我需要减少到特定数量。
排除标准是,如果首次提交的变量H1 = 5,则该ID被排除。因此,ID直到M6才能提交调查,如果M6H1 = 5,则将其排除在外。
因此,我要查找的特定变量根据月份散布在整个数据框中。例如。 M1H1,M2H1,M3H1,M4H1 .... M13H1
ID M1H1 M1R3 M1R4 M1R5 M1R6 M1R7 M1R8 M1R9 M1S7 M1S53 M1S55 M1L52 M2H1 M2R3 M2R4 M2R5 M2R6 M2R7 M2R8 M2R9 M2S7 M2S53 M2S55 M2L52
1 5 6 4 7 5 3 4 5 5 2 2 3 5 4 6 6 1 5 7 90 1 7 3 3
2 NA NA NA NA NA NA NA NA NA NA NA NA 5 3 6 7 1 7 4 2 5 5 6 5
3 3 6 33 9 1 1 1 1 2 3 4 2 5 3 6 7 1 7 4 2 5 5 6 5
4 2 7 2 3 1 2 1 3 2 1 2 3 5 4 6 6 1 5 7 90 1 7 3 3
5 NA NA NA NA NA NA NA NA NA NA NA NA 5 3 6 7 1 7 4 2 5 5 6 5
在此示例中,将删除ID 1、2和5。
我将数据集简化为将要使用的变量。我可能还要再添加一个。
我如何删除在回答的第一个月中为此特定变量给出5的答案的特定行?
如果在给出5之前的几个月中给出了其他任何值,那么我将保留该行。
为清楚起见而编辑
答案 0 :(得分:0)
我不确定是否会关注您。
以下是您需要的吗?
data[data$M1X1 != 5 & data$M2X1 != 5 & data$M3X1 != 5,]
of或dplyr
data %>% filter(M1X1 != 5, M2X1 != 5, M3X1 != 5)
答案 1 :(得分:0)
以下内容与名称中带有X1
的列数无关。
cols <- grep("X1", names(survey))
for(cc in cols){
m <- min(which(survey[[cc]] == 5))
if(!is.null(m)) survey <- survey[-m, ]
}
survey
# ID V1 V2 V3 M1X1 V6 V7 V8 M2X1 V10 V11 V12 M3X1
#3 3 6 33 9 1 1 1 1 2 3 4 2 1
#4 4 7 2 3 1 2 1 3 2 1 2 3 1
您可以编写一个使上述代码更通用的函数。
reduceRows <- function(DF, pattern, value){
cols <- grep(pattern, names(DF))
for(cc in cols){
m <- min(which(DF[[cc]] == value))
if(!is.null(m)) DF <- DF[-m, ]
}
DF
}
reduceRows(survey, "X1", 5)
结果完全一样。
数据。
survey <- read.table(text = "
ID V1 V2 V3 M1X1 V6 V7 V8 M2X1 V10 V11 V12 M3X1
1 6 4 7 5 3 4 5 5 2 2 3 5
2 NA NA NA NA NA NA NA 5 4 5 7 5
3 6 33 9 1 1 1 1 2 3 4 2 1
4 7 2 3 1 2 1 3 2 1 2 3 1
5 NA NA NA NA NA NA NA NA NA NA NA 5
", header = TRUE)
答案 2 :(得分:0)
tidyverse解决方案:
数据
df <- data.table::fread("
ID M1H1 M1R3 M1R4 M1R5 M1R6 M1R7 M1R8 M1R9 M1S7 M1S53 M1S55 M1L52 M2H1 M2R3 M2R4 M2R5 M2R6 M2R7 M2R8 M2R9 M2S7 M2S53 M2S55 M2L52
1 5 6 4 7 5 3 4 5 5 2 2 3 5 4 6 6 1 5 7 90 1 7 3 3
2 NA NA NA NA NA NA NA NA NA NA NA NA 5 3 6 7 1 7 4 2 5 5 6 5
3 3 6 33 9 1 1 1 1 2 3 4 2 5 3 6 7 1 7 4 2 5 5 6 5
4 2 7 2 3 1 2 1 3 2 1 2 3 5 4 6 6 1 5 7 90 1 7 3 3
")
代码
library(tidyverse)
df %>%
mutate_all(as.numeric) %>%
rownames_to_column(var = "new_id") %>%
select(-ID) %>%
gather(k, v, contains("H")) %>%
group_by(new_id) %>%
filter(first(v, order_by = k) != 5) %>%
spread(k, v)
结果:
# A tibble: 2 x 25
# Groups: new_id [2]
new_id M1R3 M1R4 M1R5 M1R6 M1R7 M1R8 M1R9 M1S7 M1S53 M1S55 M1L52 M2R3 M2R4 M2R5 M2R6 M2R7 M2R8 M2R9 M2S7 M2S53 M2S55 M2L52 M1H1 M2H1
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 3 6 33 9 1 1 1 1 2 3 4 2 3 6 7 1 7 4 2 5 5 6 5 3 5
2 4 7 2 3 1 2 1 3 2 1 2 3 4 6 6 1 5 7 90 1 7 3 3 2 5