R> data.frame(x1=1:3, x2=11:13, y=c('a', 'a;b', 'b'))
x1 x2 y
1 1 11 a
2 2 12 a;b
3 3 13 b我有一个类似于上述格式的data.frame,如果y包含a,那么x1将被添加到结果中,如果y包含b,那么x2将被添加到结果中。
对于这个特定的例子,结果应该是data.frame(i=c(1,2,2,3), v=c(1, 2, 12, 13)),其中i是索引。必须保持输入中的顺序。使用逐元素操作来执行这些任务是非常简单的。但我想知道是否有一个更有效的实现(例如,基于向量操作)。这个问题是否有更有效的解决办法?
编辑
基于*apply的方法可能是
f=data.frame(x1=1:3, x2=11:13, y=c('a', 'a;b', 'b'))
n=nrow(f)
do.call(
rbind
, lapply(seq_len(n), function(i) {
do.call(
rbind
, lapply(strsplit(f$y[[i]], ';')[[1]], function(x) {
if(x=='a') {
data.frame(i=i, v=f$x1[[i]])
} else if(x=='b') {
data.frame(i=i, v=f$x2[[i]])
} else {
NULL
}
})
)
})
)发布于 2022-04-10 06:32:10
我不知道如何有效地解决你的特殊情况,但以下是我的建议:
library(tidyr)
dat <- tibble( # First create the data
x1 = 1:3, x2 = 11:13, y = c('a', 'a;b', 'b'))
dat %>%
add_row(x1 = 23, x2 = -2, y = "bla") %>% # Add a row for testing purposes
separate_rows(y, sep = ";") %>% # separate rows with ";"
mutate(
result =
case_when( # Output either x1 or x2 based on the value in "y"
y == "a" ~ x1,
y == "b" ~ x2))发布于 2022-04-10 07:03:00
这将为您提供所需的输出:
vector <- df %>%
separate_rows(y) %>%
mutate(new_col = ifelse(y=="a", x1, x2)) %>%
pull(new_col)
dput(vector)产出:
c(1L, 2L, 12L, 13L)https://stackoverflow.com/questions/71814219
复制相似问题