将 NA 替换为 r 中每个组的同一列的另一行中的值 - 值在组内不唯一
Replace NA with values in another row of same column for each group in r - values not unique within group
我有一个问题与上一个问题非常相似,但我无法将其概括为我的情况。
我的数据看起来有点像这样
在每个 ID 中,我有几个 Vis 行。我感兴趣的只有 a 和 b。数据是这样的,对于数据 (V1...V7) 中的每一列,如果 a 存在,则 b 存在并且对于所有a、b 的值缺失,反之亦然。我想为每个 ID 组组合 Vis 的 a 和 b 这样我就有一行(a 或 b 甚至是新行,这并不重要)没有任何列的任何缺失数据。
根据显示的图像,这可能有帮助。在这里,我使用只有几个 V 列的实际 NA。
我们为以 'V' 开头后跟数字 ('nm1') 的列名创建一个数字索引。将 'data.frame' 转换为 'data.table' (setDT(df1)
),按 'ID' 分组,我们使用 Map
,循环索引 'nm1' 指定的列(SD[, nm1, with=FALSE]
) 和 'Vis' 列,replace
'V' 列元素,其中 'Vis' 是 'a' 或 'b'非 NA 元素 (na.omit(x[..
),并将输出分配给数字索引。
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]
我们将 'b' 值更改为 'a'
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
数据
df1 <- data.frame(ID= rep(c(2,3,4), c(3,2,4)), Vis=c('a', 'b', 'c', 'a',
'b', 'a', 'b', 'c', 'd'), V1= c(1, NA, 4, 3, NA, NA, 2, 3, 1),
V2= c(NA, 2, 5, 4, NA, 3, NA, 4, 1), stringsAsFactors=FALSE)
只需在删除 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))
}
我有一个问题与上一个问题非常相似,但我无法将其概括为我的情况。
我的数据看起来有点像这样
在每个 ID 中,我有几个 Vis 行。我感兴趣的只有 a 和 b。数据是这样的,对于数据 (V1...V7) 中的每一列,如果 a 存在,则 b 存在并且对于所有a、b 的值缺失,反之亦然。我想为每个 ID 组组合 Vis 的 a 和 b 这样我就有一行(a 或 b 甚至是新行,这并不重要)没有任何列的任何缺失数据。
根据显示的图像,这可能有帮助。在这里,我使用只有几个 V 列的实际 NA。
我们为以 'V' 开头后跟数字 ('nm1') 的列名创建一个数字索引。将 'data.frame' 转换为 'data.table' (setDT(df1)
),按 'ID' 分组,我们使用 Map
,循环索引 'nm1' 指定的列(SD[, nm1, with=FALSE]
) 和 'Vis' 列,replace
'V' 列元素,其中 'Vis' 是 'a' 或 'b'非 NA 元素 (na.omit(x[..
),并将输出分配给数字索引。
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]
我们将 'b' 值更改为 'a'
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
数据
df1 <- data.frame(ID= rep(c(2,3,4), c(3,2,4)), Vis=c('a', 'b', 'c', 'a',
'b', 'a', 'b', 'c', 'd'), V1= c(1, NA, 4, 3, NA, NA, 2, 3, 1),
V2= c(NA, 2, 5, 4, NA, 3, NA, 4, 1), stringsAsFactors=FALSE)
只需在删除 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))
}