首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列与R中的case_when (across())内的后续列合并的一般方法

将列与R中的case_when (across())内的后续列合并的一般方法
EN

Stack Overflow用户
提问于 2021-06-21 23:13:12
回答 1查看 34关注 0票数 2

我在R中有一个df,这是一个简化的版本:

代码语言:javascript
运行
复制
ID <- c("AA1", "AA2","AA3","AA4","AA5")
Pop <- c("AA","AA","AA","AA","AA")
abc08 <- c(2,1,2,0,2)
...4 <- c(3,4,4,0,3)
abc11 <- c(2,2,2,2,1)
...5 <- c(3,4,4,4,3)
df <- data.frame(ID, Pop, abc08, ...4, abc11, ...5)
df

我希望将以"abc“开头的列与其后续列合并,使df看起来如下所示:

代码语言:javascript
运行
复制
ID <- c("AA1", "AA2","AA3","AA4","AA5")
Pop <- c("AA","AA","AA","AA","AA")
abc08 <- c("2-3","1-4","2-4",NA,"2-3")
abc11 <- c("2-3","2-4","2-4","2-4","1-3")
df <- data.frame(ID, Pop, abc08, abc11)
df

我原来的df有更多的列,所以我正在寻找一种通用的方法。到目前为止,我得到的代码如下所示:

代码语言:javascript
运行
复制
  df %>% mutate(across(starts_with("abc"),
                ~ case_when(. > 0 ~ paste(., "content of subsequent column", sep = "-"),
                            . == 0 ~ NA_character_
                )))%>%
  select(!starts_with("..."))

其中“后续列的内容”显然需要标识“.”之后的列。我不可能是第一个遇到这个问题的人,但我已经找了好几个小时了,但什么也没找到……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-22 03:24:00

尝试以下操作:

代码语言:javascript
运行
复制
library(tidyverse)

df %>%
  mutate(across(starts_with("abc"), 
                ~ paste0(., "-", get(colnames(df)[which(colnames(df) == cur_column()) + 1]) ))) %>%
  select(!starts_with("..."))

输出:

代码语言:javascript
运行
复制
   ID Pop abc08 abc11
1 AA1  AA   2-3   2-3
2 AA2  AA   1-4   2-4
3 AA3  AA   2-4   2-4
4 AA4  AA   0-0   2-4
5 AA5  AA   2-3   1-3

这在没有case_when的情况下是有效的,因为paste0是矢量化的。以get开头的长短语动态地检索目标"abc“列之后的任何列的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68070429

复制
相关文章

相似问题

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