基于跨多列应用函数在 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))
当然,对于多列来说,这不是一个特别优雅的解决方案。
谢谢!
使用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(.))
这可行
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")))))
希望对您有所帮助!
我想做的是将函数应用于数据框中的多个列,将输出记录为新列。为了使这一点更清楚,我想采用以下形式的数据框:
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))
当然,对于多列来说,这不是一个特别优雅的解决方案。
谢谢!
使用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(.))
这可行
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")))))
希望对您有所帮助!