R 行中除一列以外的所有列的百分比更改
大家好 我有以下R 行中除一列以外的所有列的百分比更改,r,R,大家好 我有以下dataframe obj <- data.frame (degree2 = c(1, 1, 2, 2, 3, 3, 4, 4), yr = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997), degree = c(1, 1, 1, 2, 1, 1, 0, 0), degree3 = c(1, 1, 6, 7, 5, 1, 0, 0) ) obj我们可以使用mutate和cross在之后按
dataframe
obj <- data.frame (degree2 = c(1, 1, 2, 2, 3, 3, 4, 4),
yr = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997),
degree = c(1, 1, 1, 2, 1, 1, 0, 0), degree3 = c(1, 1, 6, 7, 5, 1, 0, 0)
)
obj我们可以使用mutate
和cross
在之后按'yr'排列
(如果未排序),并通过修改cross
中的名称创建新列
library(dplyr)
obj <- obj %>%
arrange(yr) %>%
mutate(across(starts_with('degree'),
~ 100 *c(0, diff(.))/., .names = '{.col}_perc_change'))
这是一个基本的R选项
> (obj[-1, -2] / obj[-nrow(obj), -2] - 1) * 100
degree2 degree degree3
2 0.00000 0 0.00000
3 100.00000 0 500.00000
4 0.00000 100 16.66667
5 50.00000 -50 -28.57143
6 0.00000 0 -80.00000
7 33.33333 -100 -100.00000
8 0.00000 NaN NaN
或者我们可以像下面这样绑定列
perc <- (obj[-1, -2] / obj[-nrow(obj), -2] - 1) * 100
perc <- setNames(perc, paste0(names(perc), "_perc_change"))
obj[rownames(perc), names(perc)] <- perc
使用正确的函数更新以计算百分比变化:
# function to calculate percentage change
pct_change <- function(x) {x/lag(x)}
obj %>%
mutate(across(c("degree2", "degree", "degree3"), pct_change))
感谢Theamslscoding和akrun:
要计算的函数:
将x
除以x的lag
减去1
,然后乘以100
pct_change <- function(x) {(x/lag(x) -1) * 100}
obj %>%
mutate(across(c(degree2, degree, degree3), pct_change, .names = "pct_change_{.col}"))
第一个答案:不正确:
# function to calculate percentage change
pct_change <- function(x) {x/lag(x)}
obj %>%
mutate(across(c("degree2", "degree", "degree3"), pct_change))
使用lappy
-
cols <- setdiff(names(obj), 'yr')
obj[paste0('perc_', cols)] <- lapply(obj[cols],function(x) c(0, diff(x))/x * 100)
obj
# degree2 yr degree degree3 perc_degree2 perc_degree perc_degree3
#1 1 1990 1 1 0.00000 0 0.00000
#2 1 1991 1 1 0.00000 0 0.00000
#3 2 1992 1 6 50.00000 0 83.33333
#4 2 1993 2 7 0.00000 50 14.28571
#5 3 1994 1 5 33.33333 -100 -40.00000
#6 3 1995 1 1 0.00000 0 -400.00000
#7 4 1996 0 0 25.00000 -Inf -Inf
#8 4 1997 0 0 0.00000 NaN NaN
cols我认为OP想要改变的百分比似乎百分比值不是correct@ThomasIsCoding. 我睡了一会儿,头脑清醒,终于解决了这个问题。谢谢你的支持!谢谢你的回复!你的解决方案非常适合我的问题。。不幸的是,我有一个由100列组成的数据帧。在尝试应用此代码时,它只计算放置在以(“”)开头的列中的百分比更改。。你知道怎么处理吗?@freddywit我以为你只需要计算“度”列。你可以在(-yr,~100*…
中把它改成,假设除了“yr”之外的所有列哇,我很高兴!谢谢!!@akrun。你能检查一下我的解决方案吗。现在是百分比变化。但是为什么原始值现在是NA?!提前谢谢。你是我的主人!非常感谢akrun!!!
# function to calculate percentage change
pct_change <- function(x) {x/lag(x)}
obj %>%
mutate(across(c("degree2", "degree", "degree3"), pct_change))
degree2 yr degree degree3 degree2_perc_change degree_perc_change degree3_perc_change
1 NA 1990 NA NA 0.0 0 0.0
2 1.00 1991 1.0 1.000 0.0 0 0.0
3 2.00 1992 1.0 6.000 50.0 0 83.3
4 1.00 1993 2.0 1.167 0.0 50 14.3
5 1.50 1994 0.5 0.714 33.3 -100 -40.0
6 1.00 1995 1.0 0.200 0.0 0 -400.0
7 1.33 1996 0.0 0.000 25.0 -Inf -Inf
8 1.00 1997 NaN NaN 0.0 NaN NaN
cols <- setdiff(names(obj), 'yr')
obj[paste0('perc_', cols)] <- lapply(obj[cols],function(x) c(0, diff(x))/x * 100)
obj
# degree2 yr degree degree3 perc_degree2 perc_degree perc_degree3
#1 1 1990 1 1 0.00000 0 0.00000
#2 1 1991 1 1 0.00000 0 0.00000
#3 2 1992 1 6 50.00000 0 83.33333
#4 2 1993 2 7 0.00000 50 14.28571
#5 3 1994 1 5 33.33333 -100 -40.00000
#6 3 1995 1 1 0.00000 0 -400.00000
#7 4 1996 0 0 25.00000 -Inf -Inf
#8 4 1997 0 0 0.00000 NaN NaN