【问题标题】:Applying a function to modify odd and even rows in R dataframe column应用函数修改 R 数据框列中的奇数行和偶数行
【发布时间】:2021-04-02 17:01:50
【问题描述】:

我正在尝试创建一个循环遍历数据框列并使用公式 j/j+lead(j) 替换奇数行 (j) 中的值的函数,其中lead(j) 是下一个(偶数) 排。反过来,我想用公式 j/j+lag(j) 替换偶数行中的值,其中 lag(j) 是来自前进(奇数)行的值。

我遇到了两个问题:

  1. 所写的函数返回 NA 的替换值。
  2. 奇数和偶数的替换应基于原始列值。

显而易见的方法是为替换值创建第二列,以便原始列保持不变。但是,我还没有达到这一点。

如果有任何建议,我将不胜感激:a) 更正我的代码,使其不会产生 NA; b) 修改代码,使计算值包含在第二列(逐行)中,而不是替换原始列中的值。

我正在尝试在不使用管道和变异的情况下执行此操作 - 用于练习。但是,看看我可以采取哪些其他方法来用更少的代码实现相同的目的会很有帮助。


x<-(c(4,3,5,6,2,1))

df<-as.data.frame(x)

func<- function(x){
    
    for(i in seq(1,length(x))){
        for(j in x){
            if(i%%2 == 1){
                j = j/lead(j)+j}
    
            else if(i%%2 == 0){
                j = j/lag(j)+j}
            }
        show(j)    
    }

}


func(df$x)

【问题讨论】:

  • 您的指令与您的代码不同。它说 j/j + lead(j),实际上只是 1 + lead(j),而你的代码说 j/lead(j) + j,我猜是后者是正确的?
  • 啊 - 我忘了在这个例子中添加括号。它应该是 j/(lead(j)+1)。很抱歉造成混乱。

标签: r function dataframe dplyr


【解决方案1】:

两种方法,loop或dplyr:

``` r
x<-(c(4,3,5,6,2,1))

df<-as.data.frame(x)

func<- function(x){
  res <- rep(NA,length(x))
  for(i in seq(1,length(x))){
      if(i%%2 == 1){
        res[i] = x[i]/ifelse(i==length(x),NA,x[i+1])+x[i]}
      
      else if(i%%2 == 0){
        res[i] = x[i]/ifelse(i==1,NA,x[i-1])+x[i]}
  }
  res
}

func(df$x)
#> [1] 5.333333 3.750000 5.833333 7.200000 4.000000 1.500000

library(dplyr)

df %>% mutate(x = ifelse(row_number()%%2, x/lead(x)+x ,x/lag(x)+x))
#>          x
#> 1 5.333333
#> 2 3.750000
#> 3 5.833333
#> 4 7.200000
#> 5 4.000000
#> 6 1.500000

【讨论】:

  • 非常感谢您的回复。我仍然想确定我在 for 循环中犯了哪些错误。有什么想法吗?。
  • 查看我的编辑,使用循环或 dplyr。注意:我纠正了我之前关于奇数/偶数的答案中的一个错误。
  • @adk_53,如果这回答了您的问题,请考虑accepting it,以便其他人知道它有效并从中受益
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多