R:Add/duplicate行到数据框并在满足条件时替换列值

R: Add/duplicate rows to a dataframe and replace column values when condition is met

我有两个名为 TableA 和 TableB 的数据框(下面可重现的示例)。

在 TableA$D 中,每当值为 NA 时,我想做两件事:

1.) Add/duplicate 相关行“n”次,其中“n”由表 B 中的行数定义。

2.) 复制行后,将 TableA$D 中的“NA”替换为 TableB 中的值。

有时 TableB 会有 7 个值,有时有 100 个值,并且事先不知道 TableB 中会出现哪些值。

A <- c("foo", "foo bar", "foo bar", "bar")
B <- c("bar", "foo", "bar bar", "foo")
C <- c("foo", "foo", "foo", "foo")
D <- c("X", NA, "X", NA)

TableA <- data.frame(A,B,C,D)
TableB <- data.frame(c(1,2,3,4,5,6,7))

我正在努力使结果看起来像这样:

A B C D
foo bar foo 1
foo bar foo 2
foo bar foo 3
foo bar foo 4
foo bar foo 5
foo bar foo 6
foo bar foo 7
foo bar foo foo X
foo bar bar bar foo 1
foo bar bar bar foo 2
foo bar bar bar foo 3
foo bar bar bar foo 4
foo bar bar bar foo 5
foo bar bar bar foo 6
foo bar bar bar foo 7
bar foo bar X

我试过按照这个例子Add values to dataframe when condition met in R,但是使用的逻辑似乎不太适合我的情况。

如有任何帮助或提示,我们将不胜感激

这似乎是你想要的。由于 for-loops,它会很慢,但这是我找到的最简单的方法。

A <- c("foo", "foo bar", "foo bar", "bar")
B <- c("bar", "foo", "bar bar", "foo")
C <- c("foo", "foo", "foo", "foo")
D <- c("X", NA, "X", NA)
TableA <- data.frame(A,B,C,D)
TableB <- data.frame(c(1,2,3,4,5,6,7))
collector<-data.frame()
lTableB<-dim(TableB)[1]
for (i in 1:dim(TableA)[1])
{
  print(i)
  tmp<-TableA[i,]
  repet<-ifelse(is.na(TableA$D[i]), lTableB, 1 )
  for (j in 1:repet) {
    tmp$D<-ifelse(repet>1, j, tmp$D)
    collector<-rbind(collector, tmp)
    }
}
collector