目的是转换数据帧的列。这是示例:
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
存在两个问题:(1)-与“ Cat”相关联的值为false;应该为3 * 1 = 3(2)-理想情况下,调用将返回原始的data.framedf
以及转换后的fact
和value
变量。
有什么想法吗?谢谢你们。
编辑:请注意,df
还有另一列third
应不受对fact
和执行的操作的影响value
。
如果要返回具有原始名称的原始列(可能在data.frame中包括其他列),则可以使用稍微不同的dplyr-approachmutate_each
代替mutate
:
library(lazyeval)
library(dplyr)
func <- function(data,fac,val) {
data %>%
mutate_each_(interp(~tolower(var), var = as.name(fac)), fac) %>%
mutate_each_(interp(~ifelse(col =='cat', var, ifelse(col == 'dog',2*var, 0)),
var=as.name(val), col = as.name(fac)), val)
}
使用功能:
func(df, "fact", "value")
# fact value
#1 dog 8
#2 2 0
#3 na 0
#4 0 0
#5 cat 9
#6 1 0
#7 cat 3
如果您希望保留数据中的其他列,则表明了与akruns答案的区别(而由于,这些列将使用akrun的方法删除transmute
):
df$some_column <- letters[1:7] # add a new column
使用该函数后,其他列现在仍保留在您的数据中,并且修改后的列保留其原始名称:
func(df, "fact", "value")
# fact value some_column
#1 dog 8 a
#2 2 0 b
#3 na 0 c
#4 0 0 d
#5 cat 9 e
#6 1 0 f
#7 cat 3 g
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句