gpt4 book ai didi

r - 函数 : nested conditions 中的 dplyr NSE 模式

转载 作者:行者123 更新时间:2023-12-02 08:25:17 25 4
gpt4 key购买 nike

目标是转换数据框的列。这是示例:

  df <- data.frame( fact=c("dog",2,"NA",0,"cat",1,"Cat"),
value=c(4,2,6,0,9,1,3) ); df$fact <- as.factor(df$fac)

func <- function(data,fac,val){
data <- data %>%
mutate_(fac= interp(~tolower(fac), fac=as.name(fac)) ) %>%
mutate_(val= interp(~ifelse(fac=='cat',1*val,
ifelse(fac=='dog',2*val,0)), fac=as.name(fac), val=as.name(val)))
return(data) }

电话:

new.df <- func(df,"fact","value")

fact value fac val
1 dog 4 dog 8
2 2 2 2 0
3 NA 6 na 0
4 0 0 0 0
5 cat 9 cat 9
6 1 1 1 0
7 Cat 3 cat 0

存在 2 个问题:(1)- 与“Cat”关联的值是假的;应该是3*1=3 (2)- 理想情况下,调用返回原始 data.frame df使用转换后的 factvalue变量。

有什么想法吗?谢谢你们。

编辑:请注意df还有一列 third它应该不受对 fact 的操作影响和 value .

最佳答案

在 OP 的代码中,“val”是基于未修改的“fact”列创建的。如果我们使用来自第一个 mutate_ 的修改后的“fac”,我们不需要 as.name(fac)

library(lazyeval)
library(dplyr)
func <- function(data,fac,val){
data <- data %>%
mutate_(fac= interp(~tolower(fac), fac=as.name(fac))) %>%
mutate_(val= interp(~ifelse(fac=='cat',1*val,
ifelse(fac=='dog',2*val,0)), val=as.name(val)))
return(data) }

func(df, 'fact', 'value')
# fact value fac val
#1 dog 4 dog 8
#2 2 2 2 0
#3 NA 6 na 0
#4 0 0 0 0
#5 cat 9 cat 9
#6 1 1 1 0
#7 Cat 3 cat 3

如果我们只需要返回修改过的列,使用transmute_

func1 <- function(data,fac,val){
data <- data %>%
transmute_(fac= interp(~tolower(fac), fac=as.name(fac)),
val= interp(~ifelse(fac=='cat',1*val,
ifelse(fac=='dog',2*val,0)), val=as.name(val)))
return(data) }

func1(df, 'fact', 'value')
# fac val
#1 dog 8
#2 2 0
#3 na 0
#4 0 0
#5 cat 9
#6 1 0
#7 cat 3

关于r - 函数 : nested conditions 中的 dplyr NSE 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com