首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减去观察到的最后值减去起始值除以R中行的单元格数

减去观察到的最后值减去起始值除以R中行的单元格数
EN

Stack Overflow用户
提问于 2022-06-23 14:29:53
回答 2查看 45关注 0票数 1

嗨,大家好,我有这个问题,我想用起始值来表示一行观察到的最后一个值,并将其除以具有值的单元格数,例如:

代码语言:javascript
复制
 Day1 day2 day3 day4 day5
3    2     1    1    1
3    4     NA   NA   NA
5    6     7    NA   NA
7    8     9    10   12

对于:第一个值是(1-3)/5第二值是(4-3)/2第三值是(7-5)/3第四值是(12-7)/5

并将所有值保存在新列中。

EN

回答 2

Stack Overflow用户

发布于 2022-06-23 14:39:52

1)定义stat函数,然后按行应用它。

代码语言:javascript
复制
library(dplyr)

stat <- function(x) (tail(x, 1) - head(x, 1)) / length(x)

DF %>% 
  rowwise %>%
  mutate(stat = stat(na.omit(c_across()))) %>%
  ungroup

给予:

代码语言:javascript
复制
# A tibble: 4 x 6
   Day1  day2  day3  day4  day5   stat
  <int> <int> <int> <int> <int>  <dbl>
1     3     2     1     1     1 -0.4  
2     3     4    NA    NA    NA  0.5  
3     5     6     7    NA    NA  0.667
4     7     8     9    10    12  1    

2) Base 或从上面使用基本R和stat:

代码语言:javascript
复制
cbind(DF, stat = apply(DF, 1, function(x) stat(na.omit(x))))
票数 3
EN

Stack Overflow用户

发布于 2022-06-23 14:51:23

一种方法是识别每行中最大的非NA索引。

使用申请:

代码语言:javascript
复制
dtf = read.table(header = TRUE, 
                 text = ' Day1 day2 day3 day4 day5
                          3    2     1    1    1
                          3    4     NA   NA   NA
                          5    6     7    NA   NA
                          7    8     9    10   12')
                
dtf$ratio = apply(dtf, 1, function(x){ind_last = max(which(!is.na(x)
                                      (x[ind_last] - x[1]) / ind_last})                 

它导致:

代码语言:javascript
复制
  Day1 day2 day3 day4 day5      ratio
  1    3    2    1    1    1 -0.4000000
  2    3    4   NA   NA   NA  0.5000000
  3    5    6    7   NA   NA  0.6666667
  4    7    8    9   10   12  1.0000000
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72731929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档