对于r中的每个组,将NA替换为同一列的另一行中的值 - 在组内不唯一

时间:2015-10-19 12:59:33

标签: r na

我有一个与前一个问题非常相似的问题,但我无法将其概括为我的情况。

我的数据看起来有点像这样

data

在每个ID中,我有几个Vis行。我感兴趣的只是 a b 。数据是这样的:对于数据中的每一列(V1 ... V7),如果存在 a ,则存在 b ,并且对于 a的所有值 b 缺失,反之亦然。我想将Vis的 a b 组合成每个ID组,这样我就有一行(a或b甚至是新行,它实际上并不是真的没有任何列的任何缺失数据。

2 个答案:

答案 0 :(得分:1)

根据图像显示,可能会有所帮助。在这里,我使用的是仅有几个V列的实际NA。

我们为列名称创建一个数字索引,以'V'开头,后跟数字('nm1')。将'data.frame'转换为'data.table'(Map),按'ID'分组,我们使用SD[, nm1, with=FALSE],循环遍历索引'nm1'指定的列({{1 }}和'Vis'列,replace'V'列元素,其中'Vis'是非NA元素('{1}})的'a'或'b',以及将输出分配给数字索引。

na.omit(x[..

我们将'b'值更改为'a'

library(data.table)
nm1 <- grep('V\\d+',colnames(df1)) 

setDT(df1)[, (nm1):= Map(function(x,y) 
    replace(x, which(y %in% c('a', 'b')), na.omit(x[y %in% c('a', 'b')])), 
     .SD[,-1, with=FALSE], list(.SD[[1]])), ID]

并获取 df1[Vis=='b', Vis := 'a']

unique

数据

 unique(df1)
 #   ID Vis V1 V2
 #1:  2   a  1  2
 #2:  2   c  4  5
 #3:  3   a  3  4
 #4:  4   a  2  3
 #5:  4   c  3  4
 #6:  4   d  1  1

答案 1 :(得分:1)

在删除NA时,只需求和所需的值。有更多的矢量化方法,但for循环更清晰。

for(I in unique(df1$ID)) {
  df_sub <- subset(df1, df1$ID==I & df1$Vis %in% c("a", "b"))
  df1 <- subset(df1, df1$ID != I)
  new_row <- apply(df_sub[, -1:-2], 2, sum, na.rm=TRUE)
  df1 <- rbind(df1, c(ID=I, new_row))
}