【问题标题】:R - merge column valuesR - 合并列值
【发布时间】:2016-10-18 11:04:16
【问题描述】:

我有一个输入数据框如下:

COL1    COL2
10     res prt
10     res
10     kitty
10     dog 
10     kitty cat
10     doggy dog

我希望输出是这样的:即 COL2 应该包含非重复的连接值

COL1    COL2
10  res prt, kitty, dog, cat, doggy

请有人帮我解决这个问题,因为我是 R 新手

【问题讨论】:

  • 只有 10 个条目吗?如果没有,请修改您的示例
  • 是的.. 10 是唯一的条目
  • 请澄清:在您的第一个条目中,您有“res prt”,第二个条目是“res”,第五个条目是“kitty cat”。在您想要的输出中,您有“res prt”,没有“prt”,然后“kitty”和“cat”是分开的。这是您希望数据的样子吗?

标签: r dataframe merge


【解决方案1】:

如果10 是唯一的条目,那么:

> new.df <- data.frame(COL1 = 10, COL2 = paste(unique(unlist(strsplit(paste(df$COL2), split = " "))), collapse = " ")) 

结果:

> new.df
  COL1                        COL2
1   10 res prt kitty dog cat doggy

编辑:

要得到确切的答案,试试这个 dumb 粗暴(因为我认为 R 中的每个 for 都被认为是错误的)brute force 解决方案:

> str <- paste(df$COL2)
> str
[1] "res prt"   "res"       "kitty"     "dog"       "kitty cat" "doggy dog"

> for(i in 2:length(str)) {
     Remaining.Words <- unlist(strsplit(str[1:i-1], split = " "))

     My.Words <- unlist(strsplit(str[i], split = " "))

     for(k in 1:length(My.Words)) {
         if(My.Words[k] %in% Remaining.Words) My.Words <- My.Words[-k]
     }

     if(length(My.Words) > 0) str[i] <- paste(My.Words, collapse = " ")
     else str <- str[-i]
 }
> str
[1] "res prt" "kitty"   "dog"     "cat"     "doggy"   "NA"     
> new.df <- data.frame(COL1 = 10, COL2 = paste(str[-6], collapse = ","))

结果_2.0:

> new.df
  COL1                        COL2
1   10 res prt,kitty,dog,cat,doggy

【讨论】:

  • 是的,这也是我的答案,但他想要逗号,所以collapse 应该是逗号
  • 不过,还有很多事情要做。上面的演示表明: - res prt 先出现,然后忽略 res - dog 先出现,然后在 doggy dog 中删除 dog 任何想法? @Amit Kohli
  • 是的..我不想将该字段拆分为单个单词。相反,我希望将整个领域视为一个领域。任何人都可以使用 gsub 或 grepl 命令提出解决方案吗???
【解决方案2】:

您可以为此使用 dplyr,尝试:

df <- data.frame(COL1 = c(rep(10, 4), rep(20, 3)),
                 COL2 = c("res prt", "res", "kitty", "kitty cat",
                          "res", "kitty", "kitty cat"),
                 stringsAsFactors = FALSE)
##  COL1      COL2
## 1   10   res prt
## 2   10       res
## 3   10     kitty
## 4   10 kitty cat
## 5   20       res
## 6   20     kitty
## 7   20 kitty cat

library(dplyr)
makeString <- function(x) {
  res <- unlist(strsplit(x, " "))
  res <- unique(res)
  paste(res, collapse = ", ")
}

df %>%  group_by(COL1) %>% summarise_all(makeString)

这给了你:

## A tibble: 2 × 2
##   COL1                 COL2
##  <dbl>                <chr>
## 1    10 res, prt, kitty, cat
## 2    20      res, kitty, cat

【讨论】:

    【解决方案3】:

    这是一个简单的例子:

    # a text column
    txt <- c("foo bar", "bar", "foo")
    
    # split it into words
    words <- unlist(strsplit(txt, " "))
    
    # return the unique values of this
    unique(words)
    [1] "foo" "bar"
    

    有意义吗?如果你想将它们连接起来打印出来,你可以说:

    cat(unique(words))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多