复制具有缺失值的行并用向量替换缺失值
Replicate rows with missing values and replace missing values by vector
我有一个数据框,其中一列有一些缺失值。
我想将具有缺失值的行复制 N 次,其中 N 是包含缺失值替换项的向量的长度。
我首先定义了一个替换向量,然后是我的起始 data.frame,然后是我想要的结果,最后是我尝试解决它。不幸的是,这没有用...
> replace_values <- c('A', 'B', 'C')
> data.frame(value = c(3, 4, NA, NA), result = c(5, 3, 1,2))
value result
1 3 5
2 4 3
3 NA 1
4 NA 2
> data.frame(value = c(3, 4, replace_values, replace_values), result = c(5, 3, rep(1, 3),rep(2, 3)))
value result
1 3 5
2 4 3
3 A 1
4 B 1
5 C 1
6 A 2
7 B 2
8 C 2
> t <- data.frame(value = c(3, 4, NA, NA), result = c(5, 3, 1,2))
> mutate(t, value = ifelse(is.na(value), replace_values, value))
value result
1 3 5
2 4 3
3 C 1
4 A 2
您可以尝试 tidyverse
解决方案
d %>%
mutate(value=ifelse(is.na(value), paste0(replace_values, collapse=","), value)) %>%
separate_rows(value, sep=",") %>%
select(value, everything())
value result
1 3 5
2 4 3
3 A 1
4 B 1
5 C 1
6 A 2
7 B 2
8 C 2
想法是用 ,
折叠的 'replace_values' 替换 NA
。然后使用 tidyr
的 separate_rows
函数将折叠后的值分开并按行绑定它们。最后根据您的预期输出对 data.frame
进行排序。
我们可以在这里使用 base R
做一个 rbind
。创建一个逻辑向量,其中 'value' 为 NA ('i1'),通过获取它的 sum
('n') 获取 NA 元素的数量,创建一个 data.frame
通过 rep
将 'replace_values' 与 'n' 以及对应于 'value' 的 NA 元素的 'result' 元素通过 length
'replace_values' 和 'rbind' 与数据集的子集,即 'value' 行
的 non-NA 元素
i1 <- is.na(df1$value)
n <- sum(i1)
rbind(df1[!i1,],
data.frame(value = rep(replace_values, n),
result = rep(df1$result[i1], each = length(replace_values))))
# value result
#1 3 5
#2 4 3
#3 A 1
#4 B 1
#5 C 1
#6 A 2
#7 B 2
#8 C 2
我有一个数据框,其中一列有一些缺失值。 我想将具有缺失值的行复制 N 次,其中 N 是包含缺失值替换项的向量的长度。
我首先定义了一个替换向量,然后是我的起始 data.frame,然后是我想要的结果,最后是我尝试解决它。不幸的是,这没有用...
> replace_values <- c('A', 'B', 'C')
> data.frame(value = c(3, 4, NA, NA), result = c(5, 3, 1,2))
value result
1 3 5
2 4 3
3 NA 1
4 NA 2
> data.frame(value = c(3, 4, replace_values, replace_values), result = c(5, 3, rep(1, 3),rep(2, 3)))
value result
1 3 5
2 4 3
3 A 1
4 B 1
5 C 1
6 A 2
7 B 2
8 C 2
> t <- data.frame(value = c(3, 4, NA, NA), result = c(5, 3, 1,2))
> mutate(t, value = ifelse(is.na(value), replace_values, value))
value result
1 3 5
2 4 3
3 C 1
4 A 2
您可以尝试 tidyverse
解决方案
d %>%
mutate(value=ifelse(is.na(value), paste0(replace_values, collapse=","), value)) %>%
separate_rows(value, sep=",") %>%
select(value, everything())
value result
1 3 5
2 4 3
3 A 1
4 B 1
5 C 1
6 A 2
7 B 2
8 C 2
想法是用 ,
折叠的 'replace_values' 替换 NA
。然后使用 tidyr
的 separate_rows
函数将折叠后的值分开并按行绑定它们。最后根据您的预期输出对 data.frame
进行排序。
我们可以在这里使用 base R
做一个 rbind
。创建一个逻辑向量,其中 'value' 为 NA ('i1'),通过获取它的 sum
('n') 获取 NA 元素的数量,创建一个 data.frame
通过 rep
将 'replace_values' 与 'n' 以及对应于 'value' 的 NA 元素的 'result' 元素通过 length
'replace_values' 和 'rbind' 与数据集的子集,即 'value' 行
i1 <- is.na(df1$value)
n <- sum(i1)
rbind(df1[!i1,],
data.frame(value = rep(replace_values, n),
result = rep(df1$result[i1], each = length(replace_values))))
# value result
#1 3 5
#2 4 3
#3 A 1
#4 B 1
#5 C 1
#6 A 2
#7 B 2
#8 C 2