Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 行中除一列以外的所有列的百分比更改_R - Fatal编程技术网

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