如何合并数据框中的行,使每个唯一ID在R中有一行

时间:2018-01-23 16:46:23

标签: r

我创建了一个包含等级变量的数据集,如下所示:

enter image description here

我想将rank1,rank2和rank3值合并为UniqueID和Predictor列,以便数据集如下所示:

enter image description here

我有点迷失在如何在R中执行此操作。我尝试使用聚合和group_by函数,但我无法实现我想要的输出。有没有办法在R中获得我想要的输出?任何有关这方面的帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

假设我们需要忽略0,如果有大于0的值,在按'UniqueID','Predictor'分组后,使用summarise_all并指定条件,如果值all则返回0为0或else返回非0的值。

library(dplyr)
df1 %>%
    group_by(UniqueID, Predictor) %>%
    summarise_all(funs(if(all(.==0)) 0L else as.integer(.[.!=0])))
# A tibble: 3 x 5
# Groups: UniqueID [?]
#  UniqueID Predictor rank1 rank2 rank3
#  <chr>    <chr>     <int> <int> <int>
#1 ID1      1             2     1     0
#2 ID2      1             1     0     1
#3 ID3      0             1     0     0

注意:假设每个'UniqueID'不超过2行。如果有多个唯一元素而不是0,请将其放在listpaste中以创建字符串

如果有多个唯一值而不是0

df1 %>%
    group_by(UniqueID, Predictor) %>%
    summarise_all(funs(if(all(.==0)) "0" else toString(unique(.[.!=0]))))

数据

df1 <- data.frame(UniqueID = c('ID1', 'ID1', 'ID2', 'ID2', 'ID3'),
   Predictor = c('1', '1', '1', '1', '0'), rank1 = c(0, 2, 0, 1, 1),
     rank2 = c(1, 0, 0, 0, 0), rank3 = c(0, 0, 1, 0, 0),
stringsAsFactors = FALSE)