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
我有两个名为 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