【问题标题】:R: Filter rows with set number of values for each columnR:为每列过滤具有设定数量值的行
【发布时间】:2021-09-21 16:01:30
【问题描述】:

我有一个非常大的数据框,其中包含 2 个具有感兴趣值的重要列,目前用逗号分隔。

例如:

ID    Data1      Data2
1     12,5,6     1
2     3, 4       
3     70, 20     10
4     80         35, 40, 30
5     50, 15     90

“12,5,6”在R中读作一个字符。

我需要对数据进行子集化,以仅获取具有 2 个“Data1”值和 1 个“Data2”值的行。在此示例中,将过滤 ID 3 和 5。

有人对此有什么好的建议吗?

我曾想过使用 tidyr 的“分离”功能对列进行单独排序并用逗号分隔,但这会涉及很多复杂的来回操作,然后我需要在最后将它们与相应的组合ID。

【问题讨论】:

    标签: r dataframe split subset


    【解决方案1】:

    也许并不简单,但应该可以:

    library(dplyr)
    
    data = data %>% filter((Data1!="") & (Data2!=""))%>%
      subset( (str_count(Data1, pattern=",")==1) & (str_count(Data2, pattern=","))==0)
    

    首先我删除包含空数据的行,然后将数据 1 中包含 1 个逗号的行(对应于 2 个数字)和数据 2 中包含 0 个逗号的行(对应于 1 个数字)进行子集化

    【讨论】:

    • 您可以将所有内容放入您的 filter-function: filter(str_count(Data1, ",") == 1, str_count(Data2, ",") == 0, !is.na(Data1), !is.na(Data2)) 或类似的表达式中。
    【解决方案2】:

    你可以用逗号分割字符串并计算长度。

    result <- subset(df, lengths(strsplit(Data1, ',\\s*')) == 2 & 
                         lengths(strsplit(Data2, ',\\s*')) == 1)
    result
    
    #  ID Data1 Data2
    #3  3 70,20    10
    #5  5 50,15    90
    

    【讨论】:

      【解决方案3】:

      我们可以删除'Data1'、'Data1'列中除,以外的字符,得到,nchar的计数来构造subsetting的逻辑向量

      subset(data, nchar(gsub("[^,]+", "", Data1)) == 1 &
            nchar(gsub("[^,]+", "", Data2)) == 0)
      

      -输出

       ID  Data1 Data2
      3  3 70, 20    10
      5  5 50, 15    90
      

      数据

      data <- structure(list(ID = 1:5, Data1 = c("12,5,6", "3, 4", "70, 20", 
      "80", "50, 15"), Data2 = c("1", NA, "10", "35, 40, 30", "90")), 
         class = "data.frame", row.names = c(NA, 
      -5L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        相关资源
        最近更新 更多