基于跨多个列应用函数在R数据帧中生成新列

问题描述 投票:1回答:2

我想要做的是将函数应用于数据框中的多个列,将输出记录为新列。为了更清楚,我想采用以下形式的数据框:

first_name  last_name   age
   Alice       Smith     45
    Bob       Richards   20

至:

first_name  last_name   age  first_name_lower  last_name_lower
   Alice       Smith     45      alice            smith
    Bob       Richards   20       bob            richards

我可以通过以下方式进行列式操作:

df$first_name_lower <- apply(df[,c('first_name')], 1, function(x) str_to_lower(x))
df$last_name_lower <- apply(df[,c('last_name')], 1, function(x) str_to_lower(x))

但当然对于多列而言,这不是一个特别优雅的解决方案。

谢谢!

r string stringr
2个回答
3
投票

这可以工作transmute_if采取谓词并执行和操作所有列满足谓词并抛弃所有其余 - 在这种情况下,我们使用is.character as predicate。由于我们要保留orignial数据,因此我们将数据集与cbind组合在一起。 要更改新列的名称,我们使用select_all"_lower"粘贴到列名的末尾

dta <- read.table(header = TRUE,sep = ",",stringsAsFactors = FALSE,
                  text = "first_name,last_name,age
Alice,Smith,45
                  Bob,Richards,20")
library(tidyverse)
cbind(dta,
      dta %>%
        transmute_if(is.character,tolower) %>% 
        select_all(funs(paste0(.,"_lower")))))

希望能帮助到你!


2
投票

使用tidyverse解决方案:

library(tidyverse)
mydf %>% 
    mutate(first_name_lower=first_name,
           last_name_lower=last_name) %>% 
    mutate_at(vars=first_name_lower,last_name_lower), ~ str_to_lower(.)))

您是否不想保留原始变量:

mydf %>% 
        mutate_at(vars(first_name_lower, last_name_lower), ~ str_to_lower(.))
© www.soinside.com 2019 - 2024. All rights reserved.