通过创建新行替换数据框中一行的值,但保留修改后的原始行

标签 r dataframe dplyr

我有一个如下所示的数据框,所有值都对应于“其他”类型,属于特定 ID:

df <- data.frame(ID = c("1", "1", "1", "2", "2", "3"), type = c("oth", "oth", "oth", "oth", "oth", "oth"), value = c("A", "B", "B", "C", "D", "D"))

 ID type value
  1  oth     A
  1  oth     B
  1  oth     B
  2  oth     C
  2  oth     D
  3  oth     D

我想将值 A、B、C 的行的类型分别更改为 1、2、3(D 保持为“oth”) .如果更改了,我想保留“oth”行,但值为 NA。

上面的 df 会导致:

df2 <- data.frame(ID = c("1", "1", "1", "1", "1", "1", "2", "2", "2", "3"), type = c("1", "oth", "2", "oth", "2", "oth", "3", "oth", "oth", "oth"), value = c("A", NA, "B", NA, "B", NA, "C", NA, "D", "D"))

 ID type value
  1    1     A
  1  oth  <NA>
  1    2     B
  1  oth  <NA>
  1    2     B
  1  oth  <NA>
  2    3     C
  2  oth  <NA>
  2  oth     D
  3  oth     D

请注意,任何匹配 A、B、C 的行都将创建一个具有正确类型的新行,但将原始行更改为值 = NA。如果可能,最好使用 dplyr 解决方案。

任何帮助将不胜感激,谢谢!

最佳答案

您可以创建一个值向量来更改和过滤 (values)。过滤这些值并将 value 列替换为 NA。使用 match'A' 更改为 1,将 'B' 更改为 2,将 'C' 更改为 3。将两个数据框绑定(bind)在一起。

library(dplyr)

values <- c('A', 'B', 'C')

df %>%
  filter(value %in% values) %>%
  mutate(value = NA)  %>%
  bind_rows(df %>%
  mutate(type = match(value, values), 
         type = replace(type, is.na(type), 'oth'))) %>%
  arrange(ID, type)

#   ID type value
#1   1    1     A
#2   1    2     B
#3   1    2     B
#4   1  oth  <NA>
#5   1  oth  <NA>
#6   1  oth  <NA>
#7   2    3     C
#8   2  oth  <NA>
#9   2  oth     D
#10  3  oth     D

关于通过创建新行替换数据框中一行的值,但保留修改后的原始行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68994617/

相关文章:

r - Dplyr Grouped Mutate 有替代方案吗?

r - 创建多个根据现有变量计算的新变量

r - 在 R 中使用 if、else if、else 创建函数

r - 在 R 中数据框的特定位置插入 NAs 列

python - 将 Bigquery 结果转换为 Pandas Data Frame

python - 在宽大的 Pandas DataFrame 中将 3 个文本列折叠为 1 个

R dplyr 将多个函数汇总到选定的变量

r - 如何拆分大型数据集并删除由 [R] 拆分的变量

r - 如何 reshape R 中的相关输出(非旋转结果数据)?

pandas - 如何在 Pandas 中将多个日期列合并为一个?