如何在R中将对角行转换为单行?

时间:2018-04-28 09:47:33

标签: r row

我有dataset1,如下所示:

dataset1 <- data.frame(  
   id1 = c(1, 1, 1, 2, 2, 2),    
   id2 = c(122, 122, 122, 133, 133, 133),  
   num1 = c(1, NA, NA, 50,NA, NA),  
   num2 = c(NA, 2, NA, NA, 45, NA),  
   num3 = c(NA, NA, 3, NA, NA, 4)  
 )

如何将多行转换为单行?

所需的输出是:

id1, id2, num1, num2, num3   
1    122   1     2      3      
2    133   50    45     4  

3 个答案:

答案 0 :(得分:0)

library(dplyr)

dataset1 %>% group_by(id1, id2) %>%
  summarise_all(funs(.[!is.na(.)])) %>%
  as.data.frame()

#   id1 id2 num1 num2 num3
# 1   1 122    1    2    3
# 2   2 133   50   45    4

注意:假设列中只有1非NA项目。

答案 1 :(得分:0)

使用data.table

library(data.table)
data.table(dataset1)[, lapply(.SD, sum, na.rm = TRUE), by = c("id1", "id2")]

#   id1 id2 num1 num2 num3
#1:   1 122    1    2    3
#2:   2 133   50   45    4

答案 2 :(得分:0)

您可以使用dplyr来实现这一目标:

library(dplyr)
dataset1 %>% 
  group_by(id1, id2) %>% 
  mutate(
    num1 = sum(num1, na.rm=T),
    num2 = sum(num2, na.rm=T),
    num3 = sum(num3, na.rm=T)
  ) %>% 
  distinct()

输出:

enter image description here

这也假设在我们要对它进行求和的任何变量中是否有重复值(如果id1 = 1具有两个值 {{1我们要对这个值求和)。如果您确信每个num1只有一个可能的值(num1到num3),那么请不要担心。