我有一个带有以下" ladder"的data.frame结构
a1 c1 p1 q1 s1 id
596 <NA> <NA> <NA> <NA> <NA> 2
597 <NA> <NA> <NA> <NA> <NA> 2
598 <NA> <NA> <NA> <NA> <NA> 2
599 <NA> <NA> 719800 <NA> <NA> 2
600 <NA> <NA> <NA> <NA> <NA> 2
601 <NA> <NA> <NA> <NA> <NA> 2
602 <NA> <NA> <NA> <NA> <NA> 2
603 44 <NA> <NA> 1 1 2
604 <NA> <NA> <NA> <NA> <NA> 2
每个变量只对每个id出现一次,不同的变量可以出现在不同的行中。
我希望每个id都有一行。我的想法是通过id重复每列中的值,然后删除重复项,所以我会有以下内容。
a1 c1 p1 q1 s1 id
44 NA 719800 1 1 2
但是,我想不出一个通用的方法。我必须在许多类似的数据集上运行此任务,因此我必须尽可能一般地编写它。
答案 0 :(得分:4)
以下是dplyr
方法:
library(dplyr)
df %>% group_by(id) %>% summarise_all(funs(na.omit(.)[1]))
# A tibble: 1 × 6
# id a1 c1 p1 q1 s1
# <int> <fctr> <lgl> <fctr> <fctr> <fctr>
#1 2 44 NA 719800 1 1
答案 1 :(得分:0)
以下是base R
选项aggregate
aggregate(.~id, df1, na.omit, na.action = NULL)
并获取具有所有NA的列的NA
将传递匿名函数
aggregate(.~id, df1, function(x) na.omit(x)[1], na.action = NULL)
# id a1 c1 p1 q1 s1
#1 2 44 <NA> 719800 1 1
默认情况下,根据?aggregate
文档na.action
参数忽略缺失值
默认设置是忽略给定变量中的缺失值。
因此,我们使用NULL
答案 2 :(得分:0)
tes <- read.delim(text = 'a1 c1 p1 q1 s1 id
NA NA NA NA NA 2
NA NA NA NA NA 2
NA NA NA NA NA 2
NA NA 719800 NA NA 2
NA NA NA NA NA 2
NA NA NA NA NA 2
NA NA NA NA NA 2
44 NA NA 1 1 2
NA NA NA NA NA 2
NA 3 NA NA NA 3
2 NA NA NA NA 3', sep = ' ')
vec <- unique(tes$id)
ans <- NULL
for(v in 1:length(vec)){
subs.v <- subset(tes, tes$id == vec[v])
vals.v <- apply(subs.v, 2, function(x) {
un.vals <- unique(na.omit(x))
ifelse(length(un.vals) == 0, NA, un.vals)
}
)
ans <- rbind(ans, vals.v)
}
ans
a1 c1 p1 q1 s1 id
vals.v 44 NA 719800 1 1 2
vals.v 2 3 NA NA NA 3