簡體   English   中英

基於跨多個列應用函數,在R數據框中生成新列

[英]Generating new columns in an R dataframe based on applying a function across multiple columns

我想做的是將一個函數應用於數據幀中的多個列,並將輸出記錄為新列。 為了更清楚地說明這一點,我想采用以下形式的數據框:

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))

但是對於多個列,這當然不是一個特別優雅的解決方案。

謝謝!

這可以工作transmute_if接受一個謂詞並在滿足該謂詞的所有列上執行和操作,並丟棄所有其余的列,在這種情況下,我們將is.character as predicate 由於我們要保留原始數據,因此將兩個數據集與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")))))

希望能幫助到你!

使用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(.))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM