首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于列的价值选择的有效实现

基于列的价值选择的有效实现
EN

Stack Overflow用户
提问于 2022-04-10 06:18:19
回答 2查看 38关注 0票数 -1
代码语言:javascript
复制
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的方法可能是

代码语言:javascript
复制
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
        }
})
    )
})
)
EN

回答 2

Stack Overflow用户

发布于 2022-04-10 06:32:10

我不知道如何有效地解决你的特殊情况,但以下是我的建议:

代码语言:javascript
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2022-04-10 07:03:00

这将为您提供所需的输出:

代码语言:javascript
复制
vector <- df %>% 
  separate_rows(y) %>% 
  mutate(new_col = ifelse(y=="a", x1, x2)) %>% 
  pull(new_col)

dput(vector)

产出:

代码语言:javascript
复制
c(1L, 2L, 12L, 13L)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71814219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档