【问题标题】:Data cleaning in R: grouping by number and then by nameR中的数据清理:按数字分组,然后按名称分组
【发布时间】:2021-04-13 19:44:50
【问题描述】:

我的数据集的一个小样本如下所示:

x <- c(1,2,3,4,1,7,1)
y <- c("A","b","a","F","A",".A.","B")
data <- cbind(x,y)

我的目标是首先将具有相同数字的数据组合在一起,然后将相同名称的数据组合在一起(A、a、.A. 在我的案例中被视为同名)。 换句话说,最终的输出应该是这样的:

xnew <- c(1,1,3,7,1,2,4)
ynew <- c("A","A","a",".A.","B","b","F")
datanew <- cbind(xnew,ynew)

目前,我只能在标有 x 的列中按数字分组。我还无法按名称分组。如有任何帮助,我将不胜感激。

注意:我需要一个自动化解决方案,因为我的原始数据集包含超过 10,000 行的 x 和 y 列。

【问题讨论】:

    标签: r dplyr tidyr data-cleaning


    【解决方案1】:

    假设您拥有的是数据框 data &lt;- data.frame(x,y) 而不是使用 cbind 生成的矩阵,您可以使用 fct_collapse 将不同的值组合成一个,然后使用 arrange 这个新列的数据 (@987654325 @) 和 x 值。

    library(dplyr)
    library(forcats)
    
    data %>%
      mutate(z = fct_collapse(y, 
                              "A" = c('A', '.A.', 'a'), 
                              "B" = c('B', 'b'))) %>%
      arrange(z, x) %>%
      select(-z) -> result
    
    result
    #  x   y
    #1 1   A
    #2 1   A
    #3 3   a
    #4 7 .A.
    #5 1   B
    #6 2   b
    #7 4   F
    

    或者您可以从y 列中删除所有标点符号,将它们变成大写或小写,然后arrange

    data %>%
      mutate(z = toupper(gsub("[[:punct:]]", "", y))) %>%
      arrange(z, x) %>%
      select(-z) -> result
    
    result
    

    【讨论】:

      【解决方案2】:
      library(dplyr)
      
      data %>% 
        as.data.frame() %>% 
        group_by(x, y) %>% 
        summarise(records = n()) %>% 
        arrange(x, y)
      

      【讨论】:

      • 似乎不对 - 可能是 arrange(y, x) 而不是 arrange(x, y)?无论如何,@Ronak-Shah 的回答解决了问题
      【解决方案3】:

      根据您的问题,这只是订购数据的问题。

      result <- data[order(data$x, data$y),]
      

      或考虑到您想整理 A 和 .A。

      result <- data[order(data$x, toupper(gsub("[^A-Za-z]","",data$y))),]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-22
        • 2019-06-06
        • 1970-01-01
        相关资源
        最近更新 更多