【问题标题】:Create new variable in dataframe list based on number of columns根据列数在数据框列表中创建新变量
【发布时间】:2021-03-19 09:42:17
【问题描述】:

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

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

【问题讨论】:

    标签: r purrr dplyr


    【解决方案1】:

    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
    

    基础 R 使用 lapply

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2015-04-21
      相关资源
      最近更新 更多