根据多个条件向列添加值
Adding values to columns based on multiple conditions
我有 1 df
如下
df <- data.frame(n1 = c(1,2,1,2,5,6,8,9,8,8),
n2 = c(100,1000,500,1,NA,NA,2,8,10,15),
n3 = c("a", "a", "a", NA, "b", "c",NA,NA,NA,NA),
n4 = c("red", "red", NA, NA, NA, NA,NA,NA,NA,NA))
df
n1 n2 n3 n4
1 1 100 a red
2 2 1000 a red
3 1 500 a <NA>
4 2 1 <NA> <NA>
5 5 NA b <NA>
6 6 NA c <NA>
7 8 2 <NA> <NA>
8 9 8 <NA> <NA>
9 8 10 <NA> <NA>
9 8 15 <NA> <NA>
首先,请看我想要的输出
df
n1 n2 n3 n4
1 1 100 a red
2 2 1000 a red
3 1 500 a red
4 2 1 <NA> red
5 5 NA b <NA>
6 6 NA c <NA>
7 8 2 <NA> red
8 9 8 <NA> red
9 8 10 <NA> red
9 8 15 <NA> red
我在 () 之前做了这个 post。但是,我意识到我需要再写一篇专栏来解决我的问题。
所以,我想通过询问来自 n1
、n2
、[=17= 的条件来 update/add n4
中的 red
].如果 n3 == "a"
,并且 n1 的值与 a 关联,则与 n1 的值在同一行的 n4 的值应添加红色(即 row 3,4th
)。同时,如果n1
的值也与n2
的值匹配(即2
),则n4
的这一行也应该加上red
.此外,n1
列的 8
与整个类似的事情有关。然后,如果我们有更多 n2
或 n1
等于 8
的值,那么该步骤将像以前一样被复制。我希望它是清楚的,如果不是我想解释更多。 (听起来像 Zig Zag 的东西)。
-注意:tidyverse
和baseR
也欢迎在这里帮助我。
请问有什么建议吗?
如果您使用的是igraph
,您可以尝试下面的代码
res <- do.call(
rbind,
lapply(
decompose(
graph_from_data_frame(replace(df, is.na(df), "NA"))
),
function(x) {
n4 <- E(x)$n4
if (!all(n4 == "NA")) {
E(x)$n4 <- unique(n4[n4 != "NA"])
}
get.data.frame(x)
}
)
)
dfout <- type.convert(
res[match(do.call(paste, df[1:2]), do.call(paste, res[1:2])), ],
as.is = TRUE
)
这给出了
> dfout
from to n3 n4
1 1 100 a red
2 2 1000 a red
3 1 500 a red
4 2 1 <NA> red
9 5 NA b <NA>
10 6 NA c <NA>
5 8 2 <NA> red
6 9 8 <NA> red
7 8 10 <NA> red
8 8 15 <NA> red
我有 1 df
如下
df <- data.frame(n1 = c(1,2,1,2,5,6,8,9,8,8),
n2 = c(100,1000,500,1,NA,NA,2,8,10,15),
n3 = c("a", "a", "a", NA, "b", "c",NA,NA,NA,NA),
n4 = c("red", "red", NA, NA, NA, NA,NA,NA,NA,NA))
df
n1 n2 n3 n4
1 1 100 a red
2 2 1000 a red
3 1 500 a <NA>
4 2 1 <NA> <NA>
5 5 NA b <NA>
6 6 NA c <NA>
7 8 2 <NA> <NA>
8 9 8 <NA> <NA>
9 8 10 <NA> <NA>
9 8 15 <NA> <NA>
首先,请看我想要的输出
df
n1 n2 n3 n4
1 1 100 a red
2 2 1000 a red
3 1 500 a red
4 2 1 <NA> red
5 5 NA b <NA>
6 6 NA c <NA>
7 8 2 <NA> red
8 9 8 <NA> red
9 8 10 <NA> red
9 8 15 <NA> red
我在 (
所以,我想通过询问来自 n1
、n2
、[=17= 的条件来 update/add n4
中的 red
].如果 n3 == "a"
,并且 n1 的值与 a 关联,则与 n1 的值在同一行的 n4 的值应添加红色(即 row 3,4th
)。同时,如果n1
的值也与n2
的值匹配(即2
),则n4
的这一行也应该加上red
.此外,n1
列的 8
与整个类似的事情有关。然后,如果我们有更多 n2
或 n1
等于 8
的值,那么该步骤将像以前一样被复制。我希望它是清楚的,如果不是我想解释更多。 (听起来像 Zig Zag 的东西)。
-注意:tidyverse
和baseR
也欢迎在这里帮助我。
请问有什么建议吗?
如果您使用的是igraph
res <- do.call(
rbind,
lapply(
decompose(
graph_from_data_frame(replace(df, is.na(df), "NA"))
),
function(x) {
n4 <- E(x)$n4
if (!all(n4 == "NA")) {
E(x)$n4 <- unique(n4[n4 != "NA"])
}
get.data.frame(x)
}
)
)
dfout <- type.convert(
res[match(do.call(paste, df[1:2]), do.call(paste, res[1:2])), ],
as.is = TRUE
)
这给出了
> dfout
from to n3 n4
1 1 100 a red
2 2 1000 a red
3 1 500 a red
4 2 1 <NA> red
9 5 NA b <NA>
10 6 NA c <NA>
5 8 2 <NA> red
6 9 8 <NA> red
7 8 10 <NA> red
8 8 15 <NA> red