我有一个如下所示的数据框,所有值都对应于“其他”类型,属于特定 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/