【问题标题】:How do I combine duplicate rows without losing unique data in R or VBA?如何在不丢失 R 或 VBA 中的唯一数据的情况下合并重复行?
【发布时间】:2019-04-25 17:12:56
【问题描述】:

我在 excel 中有一个表,其中有唯一的列,但有许多重复的行。重复项由“uniqueID”列衡量,该列是存储为字符串的电子邮件。行可以具有相同的 uniqueID,但在其他列中缺少数据,或者在同一列中具有不同的数据。

我希望能够合并和合并这些重复的行,如果相同的 uniqueID 对字符串具有相同的响应,则将合并和连接,这样数据就不会丢失。所有数据都是字符串。

我在 R 和 dplyr 中尝试了 Aggregate 函数,但没有成功,主要是因为我仍然不确定这两个函数是如何工作的。

输入:

uniqueID, favFruits, favVeggie, State, favColor
john@mail.com, NULL, carrots, CA, Green
jill@mail.com, apples, NULL, FL, NULL
john@mail.com, grapes, beets, CA, Red
jill@mail.com, cherries, beans, FL, Blue
jill@mail.com, pineapple, beans, FL, Blue 
john@mail.com, grapes, beets, CA, Yellow

输出:

uniqueID, favFruits, favVeggie, State, favColor
john@mail.com, grapes, (carrots, beets), CA, (Green, Red, Yellow)
jill@mail.com, (apples, cherries, pineapple), beans, FL, Blue

注意:

“NULL”在这个意义上只是一个空白的excel单元格。它没有被命名为 NULL 或任何东西。完整数据集共有约 30 列和约 20000 行。每列中的“()”表示一个包含两个值的单元格,而不是在单元格内有括号。

【问题讨论】:

标签: r excel vba


【解决方案1】:

我会接受 Dave2e 的回答,并更进一步,像这样删除所有 NULL:

library(tidyverse)

input <- tibble::tribble(
          ~uniqueID,  ~favFruits, ~favVeggie, ~State, ~favColor,
    "john@mail.com",      "NULL",  "carrots",   "CA",   "Green",
    "jill@mail.com",    "apples",     "NULL",   "FL",    "NULL",
    "john@mail.com",    "grapes",    "beets",   "CA",     "Red",
    "jill@mail.com",  "cherries",    "beans",   "FL",    "Blue",
    "jill@mail.com", "pineapple",    "beans",   "FL",    "Blue",
    "john@mail.com",    "grapes",    "beets",   "CA",  "Yellow"
    )


output <- input %>% 
    mutate_all(list(~str_replace(., "NULL", NA_character_))) %>% 
    group_by(uniqueID) %>% 
    summarise_all(list(~toString(unique(na.omit(.)))))

output

# A tibble: 2 x 5
  uniqueID      favFruits                   favVeggie      State favColor          
  <chr>         <chr>                       <chr>          <chr> <chr>             
1 jill@mail.com apples, cherries, pineapple beans          FL    Blue              
2 john@mail.com grapes                      carrots, beets CA    Green, Red, Yellow

【讨论】:

    【解决方案2】:

    这是使用 dplyr 库的一个直截了当的问题。关键是按 uniqueID 分组并使用toString 将唯一字符串连接在一起。

    df<-read.table(header=TRUE, text="uniqueID favFruits favVeggie State favColor
    john@mail.com NA carrots CA Green
    jill@mail.com apples NA FL NA
    john@mail.com grapes beets CA Red
    jill@mail.com cherries beans FL Blue
    jill@mail.com pineapple beans FL Blue 
    john@mail.com grapes beets CA Yellow")
    
    
    library(dplyr)
     answer<- df %>% group_by(uniqueID) %>% summarize_all(list(~toString(unique(.))) ) 
    
    print(answer)
    # A tibble: 2 x 5
      uniqueID      favFruits                   favVeggie      State favColor          
      <fct>         <chr>                       <chr>          <chr> <chr>             
    1 jill@mail.com apples, cherries, pineapple NA, beans      FL    NA, Blue          
    2 john@mail.com NA, grapes                  carrots, beets CA    Green, Red, Yellow
    

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2017-03-19
      • 2017-04-30
      • 2018-10-26
      • 1970-01-01
      相关资源
      最近更新 更多