根据R中的特定变量简化数据集

时间:2018-08-17 12:49:42

标签: r

我有一个庞大的数据集,其中包含提交每月调查的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之前的几个月中给出了其他任何值,那么我将保留该行。

为清楚起见而编辑

3 个答案:

答案 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