有条件地复制行时出错-R

时间:2019-07-18 13:52:39

标签: r

我有一个数据列,其中的列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

有人可以帮忙吗?

3 个答案:

答案 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>