当前位置: 首页 > 知识库问答 >
问题:

在一列中串联列名,条件是使用mutate、across和case_when

干鑫鹏
2023-03-14
    null
df <- tribble(
~ID,    ~A1,    ~A2,    ~A3,
1, 0, 1, 1, 
2, 0, 1, 1, 
3, 1, 1, 1, 
4, 1, 0, 1, 
5, 0, 1, 0)
# A tibble: 5 x 5
     ID    A1    A2    A3 New_Col 
  <dbl> <dbl> <dbl> <dbl> <chr>   
1     1     0     1     1 A2 A3   
2     2     0     1     1 A2 A3   
3     3     1     1     1 A1 A2 A3
4     4     1     0     1 A1 A3   
5     5     0     1     0 A2   
df %>% 
  rowwise() %>% 
  mutate(New_Col = across(A1:A3, ~ case_when(. == 1 ~ paste0("colnames(.)", collapse = " "))))
     ID    A1    A2    A3 New_Col$A1  $A2         $A3        
  <dbl> <dbl> <dbl> <dbl> <chr>       <chr>       <chr>      
1     1     0     1     1 NA          colnames(.) colnames(.)
2     2     0     1     1 NA          colnames(.) colnames(.)
3     3     1     1     1 colnames(.) colnames(.) colnames(.)
4     4     1     0     1 colnames(.) NA          colnames(.)
5     5     0     1     0 NA          colnames(.) NA   
    null

共有1个答案

太叔灿
2023-03-14

若要将case_when一起使用,可以执行以下操作-

library(dplyr)
library(tidyr)

df %>% 
  mutate(across(A1:A3, ~case_when(. == 1 ~ cur_column()), .names = 'new_{col}')) %>%
  unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ')

#    ID    A1    A2    A3 New_Col 
#  <dbl> <dbl> <dbl> <dbl> <chr>   
#1     1     0     1     1 A2 A3   
#2     2     0     1     1 A2 A3   
#3     3     1     1     1 A1 A2 A3
#4     4     1     0     1 A1 A3   
#5     5     0     1     0 A2      

across创建3个新列,名称分别为new_a1new_a2new_a3,如果值为1,则为na。使用unite我们将3列合并为一个new_col

我们还可以将rowwisec_ancers一起使用-

df %>% 
  rowwise() %>% 
  mutate(New_Col = paste0(names(.[-1])[c_across(A1:A3) == 1], collapse = ' '))
 类似资料:
  • 我目前在R中有一个数据框,看起来像这样 我用group_by将数据按动物分组。我想创建一个新的列V6,它采用列V4,将较低的值除以较高的值,如果该值小于0.5,则V6= A,ifelse则V6 = b..有没有办法在R中使用带条件语句的mutate函数?实际的数据框要大得多,所以我宁愿不用手动操作。这是我希望最终数据框的样子 这就是我开始做的 但我知道这是不对的。非常感谢。

  • 在dplyr工作流中,当newvar==0时,我尝试在dataframe的每一列中的newvar列后粘贴一个0,否则不做任何操作。我修改了iris数据集: null

  • Sequelize -在where条件中关联表列 我想在序列模型中执行这个查询: 我尝试使用sequelize.col()函数,但仍然无法计算值。我的代码如下 我的活动模型,表名model_activity FindQuery现在返回值,但sequelize.col(“Activity.duration”)没有任何作用 但上面的代码没有填充“Activity.duration”持续时间值。没有错误

  • 问题内容: 我观察到有两种方法可以在多个表上实现目标。结果集中的一列将被更新,并且可能需要速度。结果集可以通过以下方式获得: 情况1: 或者 情况2: 两者给出的结果相同,只是连接条件有所不同。哪个运行/执行速度更快? eval_id为,report_type和course_name为。 对于所使用的开发人员,情况1具有以下统计信息:[SELECT-3077行,0.048秒]提取了结果集…执行了1

  • 我想使用PowerShell生成命令列表,将文件从一个位置移动到另一个位置。(我确信PowerSell确实可以移动,但我想先看看命令列表……是的,我知道)。 文件位于下一层的一系列子文件夹中,需要移动到另一台主机上相应的一系列子文件夹中。子文件夹具有8位标识符。我需要一系列命令,比如 该文件需要进入相应的8位标识符文件夹的\导入子目录。 下面的PowerShell将生成我需要的数据 但我一直在研究

  • 问题内容: 我有两个这样的表,两个都是单独的表 另一个表包含以下结构 我需要从表II中选择AccountNo或TempAccountNo,Mycolumn,条件是 我需要选择 我需要选择 我该如何实现。 问题答案: