根据同一行位置中前一列的值来计算一列中的值

如何解决根据同一行位置中前一列的值来计算一列中的值

我有很多列要基于函数(1 + x)^ k计算值,其中x是来自特定列的值,k是我们尝试为其计算的列的索引。我只想对表中所有列的子集进行计算。

例如:

df = data.frame(A = c(0.1,0.05,0.2),B = c(1,1,1),C = c(NA,NA,NA),D = c(NA,NA)

我想使用A列中的值仅将函数应用于C和D列。

例如df [1,4]的计算方式为(1 +(-0.1)^ 4,因为4是D列的索引。

另一种解释是,对于选定的列(在此示例中为C和D),该值是前一列的值乘以(1 + x),即df [1,4] = df [1,3] *(1 +(-0.1)),结果相同

解决方法

一个dplyr选项可能是:

df %>%
 rowwise() %>%
 mutate((1 + A)^(across(C:D,~ replace(.,is.na(.),1)) * which(names(.) %in% c("C","D"))))

      A     B     C     D
  <dbl> <dbl> <dbl> <dbl>
1  0.1      1  1.33  1.46
2  0.05     1  1.16  1.22
3  0.2      1  1.73  2.07

或者C和D列始终为NA:

df %>%
 rowwise() %>%
 mutate((1 + A)^(1^across(C:D) * which(names(.) %in% c("C","D"))))
,

也许是这样的:

f = function(df,target_cols = c("C","D"),index_col = "A"){
  
  # df is your data frame 
  # target_cols is a vector of columns you want apply the function (1 + x)^k 
  # index_col is the the x in (1 + x)^k

  stopifnot(all(target_cols %in% names(df)))
  stopifnot(index_col %in% names(df))
  
  # Get index of target columns i.e k
  which_col = which(names(df) %in% target_cols)
  
  # Loop over columns
  for(i in which_col){
    df[,i] = (1 + df[,index_col])^i
  }
  
  return(df)
  
}

df = data.frame(A = c(0.1,0.05,0.2),B = c(1,1,1),C = c(NA,NA,NA),D = c(NA,NA))
f(df)                

     A B        C        D
1 0.10 1 1.331000 1.464100
2 0.05 1 1.157625 1.215506
3 0.20 1 1.728000 2.073600
,

您描述的功能定义如下:

func1 = function(df,i) {
  (1+df[1]^i)
}
,

base R中的一个选项应该是

df[3:4] <- (1 + df$A)^col(df)[,3:4]

或与Reduce

df[c('C','D')] <- lapply(match(c('C','D'),names(df)),function(i) 
     Reduce(function(x,y) (1 + y)^i,df[,'A'],accumulate = TRUE,init = df$A[1])[-1])

df
#     A B        C        D
#1 0.10 1 1.331000 1.464100
#2 0.05 1 1.157625 1.215506
#3 0.20 1 1.728000 2.073600

或使用map/accumulate

library(purrr)
library(dplyr)
map_dfc(set_names(match(c('C',names(df)[3:4]),~ {
            i <- .x
            accumulate(df$A,~(1 + .y)^i,.init = first(df$A))[-1]}) %>% 
   bind_cols(df[1:2],.)
#     A B        C        D
#1 0.10 1 1.331000 1.464100
#2 0.05 1 1.157625 1.215506
#3 0.20 1 1.728000 2.073600

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?