首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用R中的unite函数消除重复值

问使用R中的unite函数消除重复值
EN

Stack Overflow用户
提问于 2020-02-17 04:01:50
回答 2查看 1K关注 0票数 1

我试图使用R中的unite函数来连接跨列的值,但也可以去重复这些值。我怎样才能做到这一点?

以下是输入的数据:

代码语言:javascript
复制
input <- tibble(
  id = c('aa', 'ss', 'dd', 'qq'),
  '2017' = c('tv', NA, NA, 'web'),
  '2018' = c('tv', 'web', NA, NA),
  '2019' = c(NA, 'web', 'book', 'tv')
)

# A tibble: 4 x 4
  id    `2017` `2018` `2019`
  <chr> <chr>  <chr>  <chr> 
1 aa    tv     tv     NA    
2 ss    NA     web    web    
3 dd    NA     NA     book  
4 qq    web    NA     tv    

使用ALL列所需的输出是:

代码语言:javascript
复制
> output
# A tibble: 4 x 5
  id    `2017` `2018` `2019` ALL   
  <chr> <chr>  <chr>  <chr>  <chr> 
1 aa    tv     tv     NA     tv    
2 ss    NA     web    web    web   
3 dd    NA     NA     book   book  
4 qq    web    NA     tv     web, tv
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-17 05:35:09

我不确定用unite是否可以去复制,但是您可以按行使用apply。

代码语言:javascript
复制
input$ALL <- apply(input[-1], 1, function(x) toString(na.omit(unique(x))))

或者tidyverse的方式可能是使用pmap

代码语言:javascript
复制
library(tidyverse)

input %>%
  mutate(ALL = pmap_chr(select(., -id), ~toString(unique(na.omit(c(...))))))

#  id    `2017` `2018` `2019` ALL    
#  <chr> <chr>  <chr>  <chr>  <chr>  
#1 aa    tv     tv     NA     tv     
#2 ss    NA     web    web    web    
#3 dd    NA     NA     book   book   
#4 qq    web    NA     tv     web, tv

或以长格式获取数据,然后加入

代码语言:javascript
复制
input %>%
  pivot_longer(cols = -id, values_drop_na = TRUE) %>%
  group_by(id) %>%
  summarise(ALL = toString(unique(value))) %>%
  left_join(input)
票数 2
EN

Stack Overflow用户

发布于 2020-02-17 04:09:41

在SO上也存在类似的问题,但是由于您需要的是一个unite解决方案,而我找不到任何专门使用unite的解决方案,所以我们可以这样做:

使用unite

代码语言:javascript
复制
input %>% unite(ALL, -id, sep = ", ", remove = FALSE, na.rm = TRUE)
## A tibble: 4 x 5
#  id    ALL     `2017` `2018` `2019`
#  <chr> <chr>   <chr>  <chr>  <chr>
#1 aa    tv      tv     NA     NA
#2 ss    web     NA     web    NA
#3 dd    book    NA     NA     book
#4 qq    web, tv web    NA     tv

要恢复预期输出的准确列顺序,可以添加一个%>% select(names(input), ALL)。

或者,使用nest

代码语言:javascript
复制
input %>%
    group_by(id) %>%
    nest() %>%
    mutate(ALL = map_chr(data, ~toString(unlist(.x[!is.na(unlist(.x))])))) %>%
    unnest(data)
## A tibble: 4 x 5
## Groups:   id [4]
#  id    `2017` `2018` `2019` ALL
#  <chr> <chr>  <chr>  <chr>  <chr>
#1 aa    tv     NA     NA     tv
#2 ss    NA     web    NA     web
#3 dd    NA     NA     book   book
#4 qq    web    NA     tv     web, tv 

或基本的R方式(如在How to create new column with all non-NA values from multiple other columns?中):

代码语言:javascript
复制
input$ALL <- apply(input[, -1], 1, function(x) toString(x[!is.na(x)]))
input
# A tibble: 4 x 5
#   id    `2017` `2018` `2019` ALL
#  <chr> <chr>  <chr>  <chr>  <chr>
#1 aa    tv     NA     NA     tv
#2 ss    NA     web    NA     web
#3 dd    NA     NA     book   book
#4 qq    web    NA     tv     web, tv
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60255793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档