首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个字符列组合成一个列,并在不知道列号的情况下删除NA

如何将多个字符列组合成一个列,并在不知道列号的情况下删除NA
EN

Stack Overflow用户
提问于 2019-03-18 04:02:23
回答 4查看 1.1K关注 0票数 5

我希望有一个列包含其他列字符没有NA。我试过pastestr_cunite,但是没有得到预期的结果。也许我用错了。

真正的情况是,我无法预先知道列号,因为每个数据集都可以随年份而变化。

例如,有些数据集包含10年,但有些数据集包含20年。

以下是输入的数据:

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

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

谢谢你的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-18 06:06:01

下面是一个base R方法

代码语言:javascript
复制
input$ALL <- apply(input[-1], 1, function(x) paste(na.omit(x), collapse=" "))
input$ALL
#[1] "tv"     "web"    "book"   "web tv"
票数 4
EN

Stack Overflow用户

发布于 2019-03-18 05:10:43

这实际上是重复(或非常接近) 问题,但从那以后一切都变了unitena.rm参数,它有助于删除NA的参数。

关于列的选择,这里我们选择了所有的列,忽略了第一个列,而没有指定列名,因此它应该适用于多年的情况。

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

input %>%
    unite("ALL", names(input)[-1], remove = FALSE, sep = " ", 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    

在安装了tidyr的开发版本之后,它通过

代码语言:javascript
复制
devtools::install_github("tidyverse/tidyr")
票数 4
EN

Stack Overflow用户

发布于 2019-03-20 08:04:24

为了完整(并补充回答),还有三种通过引用更新input的方法,即不复制整个数据对象。

所有方法都返回相同的结果,并且可以处理任意的年数。

请注意,id应该是唯一的键,即没有任何重复项。

重塑,na.omit(),聚合

代码语言:javascript
复制
library(data.table)
setDT(input)[, ALL := melt(input, id.var = "id")[, toString(na.omit(value)), by = id]$V1][]

id 2017 2018 2019 ALL 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

顺便说一句,从宽到长格式的整形显示了一种更简洁的存储稀疏数据的方法。

代码语言:javascript
复制
melt(input, id.var = "id", na.rm = TRUE)

id variable value 1: aa 2017 tv 2: qq 2017 web 3: ss 2018 web 4: dd 2019 book 5: qq 2019 tv

重塑,聚合,连接

代码语言:javascript
复制
library(data.table)
setDT(input)[melt(input, id.var = "id", na.rm = TRUE)[, toString(value), by = id],
             on = "id", ALL := V1][]

这将从重塑步骤的结果中删除NA值,这会由于多个NA而扭曲原始行顺序。因此,需要更新联接。

Filter(),聚合的

代码语言:javascript
复制
library(data.table)
setDT(input)[, ALL := .SD[, toString(Filter(Negate(is.na), .SD)), by = id]$V1][]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55214633

复制
相关文章

相似问题

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