我希望有一个列包含其他列字符没有NA。我试过paste,str_c和unite,但是没有得到预期的结果。也许我用错了。
真正的情况是,我无法预先知道列号,因为每个数据集都可以随年份而变化。
例如,有些数据集包含10年,但有些数据集包含20年。
以下是输入的数据:
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列所需的输出是:
> 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谢谢你的帮助!
发布于 2019-03-18 06:06:01
下面是一个base R方法
input$ALL <- apply(input[-1], 1, function(x) paste(na.omit(x), collapse=" "))
input$ALL
#[1] "tv" "web" "book" "web tv"发布于 2019-03-18 05:10:43
这实际上是重复(或非常接近) 这问题,但从那以后一切都变了。unite有na.rm参数,它有助于删除NA的参数。
关于列的选择,这里我们选择了所有的列,忽略了第一个列,而没有指定列名,因此它应该适用于多年的情况。
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的开发版本之后,它通过
devtools::install_github("tidyverse/tidyr")发布于 2019-03-20 08:04:24
为了完整(并补充回答),还有三种通过引用更新input的方法,即不复制整个数据对象。
所有方法都返回相同的结果,并且可以处理任意的年数。
请注意,id应该是唯一的键,即没有任何重复项。
重塑,na.omit(),聚合
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
顺便说一句,从宽到长格式的整形显示了一种更简洁的存储稀疏数据的方法。
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
重塑,聚合,连接
library(data.table)
setDT(input)[melt(input, id.var = "id", na.rm = TRUE)[, toString(value), by = id],
on = "id", ALL := V1][]这将从重塑步骤的结果中删除NA值,这会由于多个NA而扭曲原始行顺序。因此,需要更新联接。
Filter(),聚合的
library(data.table)
setDT(input)[, ALL := .SD[, toString(Filter(Negate(is.na), .SD)), by = id]$V1][]https://stackoverflow.com/questions/55214633
复制相似问题