按ID按特定值填写列的所有条目

时间:2017-04-25 20:19:24

标签: r dataframe

我有一个带有以下" 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

但是,我想不出一个通用的方法。我必须在许多类似的数据集上运行此任务,因此我必须尽可能一般地编写它。

3 个答案:

答案 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