我正在尝试将由分类列和数字列组成的数据框转换为一个数据框,其中每个值代表该列内的相对频率。我需要灵活地扩展,因此使用我正在使用的数据框中列出的列名无法达到我的目的。
作为一个玩具示例,请考虑以下数据框:
df<-data.frame(fruit=c('apple','apple','pear','orange','apple','pear'),
price=c(47,92,87,14,21,19),
town=c('home','far','close','close','close','far'))
作为目标数据框,我希望得到以下结果:
goal<-data.frame(fruit=c(.50,.50,.33,.17,.5,.17),
price=c(.01,1.29,1.14,-0.93,-0.73,-0.79),
town=c(.17,.33,.50,.50,.50,.33))
在目标数据框中,我希望缩放数字列,并将具有分类值的列转换为该列中值的相对频率。例如,对于数据框中的六个记录中的三个,出现“苹果”,因此.50反映了列中的3/6。
我能够使用以下命令将price
变量以及数据框中的所有数字列转换为z分数:
newdf <- df %>%
mutate_if(is.numeric,scale)
这实现了我对数字列的目标,因为缩放后的值对我而言比连续标度上的值出现的次数更有趣(我将在其中使用的大多数集合都具有成千上万的小数位,而精确重复是不在那里)。
我尝试对在此答案中找到的代码进行一些细微的编辑:dplyr:将函数table()应用于data.frame的每一列,但未能实现我的目标。我怎样才能达到理想的结果?
先感谢您!
这是另一种选择
library(qdapTools) # for `lookup` function
df %>%
mutate_if(is.numeric,scale) %>%
mutate_if(is.factor, function(x) lookup(x, as.data.frame(prop.table(table(x))))) %>%
round(2)
# fruit price town
# 1 0.50 0.01 0.17
# 2 0.50 1.29 0.33
# 3 0.33 1.15 0.50
# 4 0.17 -0.93 0.50
# 5 0.50 -0.73 0.50
# 6 0.33 -0.79 0.33
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句