我有一个与前一个问题非常相似的问题,但我无法将其概括为我的情况。
我的数据看起来有点像这样
在每个ID中,我有几个Vis行。我感兴趣的只是 a 和 b 。数据是这样的:对于数据中的每一列(V1 ... V7),如果存在 a ,则存在 b ,并且对于 a的所有值, b 缺失,反之亦然。我想将Vis的 a 和 b 组合成每个ID组,这样我就有一行(a或b甚至是新行,它实际上并不是真的没有任何列的任何缺失数据。
答案 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))
}