我有一个数据列,其中的列A,B,C如下:
A <- c("NX300", "BT400", "GD200")
B <- c("M0102", "N0703", "M0405")
C <- c(NA, "M0104", "N0404")
df <- data.frame (A,B,C)
相反,无论何时C中的值不是NA,我都想复制一行,并用NA替换重复行的B值。这是所需的输出:
A1 <- c("NX300", "BT400", "BT400", "GD200", "GD200")
B1 <- c("M0102", "N0703", NA, "M0405", NA)
C1 <- c(NA, NA, "M0104", NA, "N0404")
df1 <- data.frame(A1,B1,C1)
要实现这一点,我尝试复制行,但尚未将B替换为NA,但是却得到以下错误代码:
rbind(df, df[,is.na(C)==FALSE])
Error: object "C" not found
有人可以帮忙吗?
答案 0 :(得分:4)
定义一个函数newrows
,该函数接受一行x
并返回它或重复的行,然后将其应用于每行。不使用任何软件包。
newrows <- function(x) {
if (is.na(x$C)) x
else rbind(replace(x, "C", NA), replace(x, "B", NA))
}
do.call("rbind", by(df, 1:nrow(df), newrows))
给予:
A B C
1 NX300 M0102 <NA>
2.2 BT400 N0703 <NA>
2.21 BT400 <NA> M0104
3.3 GD200 M0405 <NA>
3.31 GD200 <NA> N0404
答案 1 :(得分:2)
一个选项是
library(dplyr)
df %>%
mutate(i1 = 1 + !is.na(C)) %>%
uncount(i1) %>%
mutate(B = replace(B, duplicated(B), NA)) %>%
group_by(A) %>%
mutate(C = replace(C, duplicated(C, fromLast = TRUE), NA))
答案 2 :(得分:1)
如果排序无关紧要,请继续尝试您的第一步,
x <- rbind(df, cbind(df[!is.na(df$C),1:2], C=NA))
x$B[!is.na(x$C)] <- NA
x
# A B C
#1 NX300 M0102 <NA>
#2 BT400 <NA> M0104
#3 GD200 <NA> N0404
#21 BT400 N0703 <NA>
#31 GD200 M0405 <NA>