按行data.table类型更改进行分组

时间:2016-08-12 09:47:16

标签: r data.table dplyr

这与问题Group by in data.table in R which only keep non NA values from columns

有关

实施例: 我有

df <- data.frame(x = c('a', 'a', 'b', 'b' ), y = c(1,NA,2,NA), z = c(NA, 3, NA, 4)) 

df

  x  y  z
1 a  1 NA
2 a NA  3
3 b  2 NA
4 b NA  4    

我想要

df2 <- data.frame(x = c('a', 'b' ), y = c(1,2), z = c(3,4))    

df2

  x y z
1 a 1 3
2 b 2 4

我遇到了与上述问题相同的问题,我尝试了接受的答案并且它有效,但它改变了数据框中内容的类型。我需要它们作为下游分析的数值保留,然后使用as.numeric不起作用。我也尝试用dplyr group_by来解决最初的问题,但它也没有用,所以我想我误解了这个函数(一般来说还是R的初学者和数据分析!)。

对不起这个非常基本的问题,但我一直试图解决这个问题!欢迎任何建议。

谢谢!

1 个答案:

答案 0 :(得分:0)

我们可以使用data.table

执行此操作
library(data.table)
dt1 <- setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]), x]
str(dt1)
#Classes ‘data.table’ and 'data.frame':  2 obs. of  3 variables:
#$ x: Factor w/ 2 levels "a","b": 1 2
#$ y: num  1 2
#$ z: num  3 4

str(df)
#Classes ‘data.table’ and 'data.frame':  4 obs. of  3 variables:
#$ x: Factor w/ 2 levels "a","b": 1 1 2 2
#$ y: num  1 NA 2 NA
#$ z: num  NA 3 NA 4

如果我们需要,我们可以更改&#39; dt1&#39;到&#39; data.frame&#39;使用setDF

setDF(dt1)