r - 根据列数在数据框列表中创建新变量

标签 r purrr dplyr

我有一个包含两个数据框的列表,其中第一列有两列,第二列有三列。

dat.list<-list(dat1=data.frame(col1=c(1,2,3),
                     col2=c(10,20,30)),
     dat2= data.frame(col1=c(5,6,7),
                      col2=c(30,40,50),
                      col3=c(7,8,9)))

# $dat1
 #  col1 col2
# 1    1   10
# 2    2   20
# 3    3   30

# $dat2
 
#   col1 col2 col3
# 1    5   30    7  
# 2    6   40    8  
# 3    7   50    9 

我正在尝试使用 map()mutate()case_when() 在两个数据帧中创建一个新列。如果数据帧有两列以上,我希望这个新列与 col3 相同,如果数据框有两列或更少列,则与 col1 相同。我尝试使用以下代码来做到这一点:

library(tidyverse)
dat.list %>% map(~ .x %>%
                   mutate(newcol=case_when(ncol(.)>2 ~ col3,
                                           TRUE  ~ col1),
                          ))

但是,这会返回以下错误:“未找到对象 'col3'”。我怎样才能得到想要的输出?下面是我想要实现的确切输出。

# $dat1
#   col1 col2 newcol
# 1    1   10      1
# 2    2   20      2
# 3    3   30      3

# $dat2
#   col1 col2 col3 newcol
# 1    5   30    7      7
# 2    6   40    8      8
# 3    7   50    9      9

最佳答案

if/else 即可:

library(dplyr)
library(purrr)

dat.list %>% map(~ .x %>% mutate(newcol= if(ncol(.) > 2) col3 else col1))

#$dat1
#  col1 col2 newcol
#1    1   10      1
#2    2   20      2
#3    3   30      3

#$dat2
#  col1 col2 col3 newcol
#1    5   30    7      7
#2    6   40    8      8
#3    7   50    9      9

使用lapply基础R:

lapply(dat.list, function(x) transform(x, newcol = if(ncol(x) > 2) col3 else col1))

关于r - 根据列数在数据框列表中创建新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66705775/

相关文章:

r - 如何将配对 t.test 或 Wilcoxon 检验应用于我的数据

r - 从包含缩写月份和 PM(及时)的时间戳转换为日期

r - purrr::map_if:仅将函数应用于特定列

r - 将数据框列中的所有列表元素提取到各个列中的函数

r - 按多个条件过滤

r - 检查 NaN 后如何用其日志替换数据帧中的所有值

r - 如何使用 purrr 将命名列表写入文件(带有列表名称)

r - 如何在 pivot_wider 中指定特定的列顺序

r - 使用 R 中的 dplyr 库到 "print"非 NA 列的名称

r - 使用包 httr 从 Web API 获取数据