r - 在 R 中使用 unite 函数并删除重复值
问题描述
我正在尝试使用unite
R 中的函数来跨列连接值,但也对值进行重复数据删除。我怎样才能做到这一点?
这是输入数据:
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 列的所需输出是:
> 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
解决方案
SO上存在类似的问题,但是由于您正在unite
寻求解决方案而我找不到任何专门使用unite
的问题,因此我们开始:
使用unite
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
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 方式(如如何使用来自多个其他列的所有非 NA 值创建新列?):
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
推荐阅读
- batch-file - 将一行文本添加到文件的批处理脚本
- reactjs - React Native:如何将 mobx-persist 添加到现有商店
- postgresql - 为时间点查询建模状态更改的最佳方法
- react-native - react-native 中的搜索栏不显示任何结果
- javascript - 在 Python 中嵌入交互式图形 - 使用 Plotly 发送电子邮件
- javascript - 以 0 开头的参数给出的数字与 JavaScript 中的预期不同?
- scala - 将 getOrElse 转换为对象
- tensorflow - 以 3d numpys 作为输入和线性回归的神经网络(一个输出)
- javascript - Cypress 跨多台机器 [Azure Devops]
- .net-core - 1 个 Visual Studio 解决方案中的两个 AspNetCore API 项目 - 只有 1 个适用于 Swashbuckle/Swagger