R中是不是有一种方法,如果一列的值满足另一列中的某个标准,则该列的值应该是上面的值

Posted

技术标签:

【中文标题】R中是不是有一种方法,如果一列的值满足另一列中的某个标准,则该列的值应该是上面的值【英文标题】:is there a way in R such that the value of a column should be the one above if it meets a certain criteria in another columnR中是否有一种方法,如果一列的值满足另一列中的某个标准,则该列的值应该是上面的值 【发布时间】:2020-04-05 18:29:45 【问题描述】:

我希望myrate 列中的值为

    myrate 的第一个值应该是rupee(减号)amt myrate 列的第二行应该是myrate 的第一个值(在点 1 中生成的值)减去Rupee 列的第二个值,如果“名称”在第一个和第二个中相同行 步骤 2 的逻辑应该继续,直到达到 Name 列中的新值(在本例中:“sss”) 4.再次在“sss”名称的第二行,步骤2的逻辑应该继续

我尝试使用dplyr,它在某些迭代中给出了正确的答案,但在其他迭代中却失败了。

table example

【问题讨论】:

你能用dput和预期的输出显示数据吗 Name Amt Rupee Myrate kkk 20 11 -9 kkk 21 333 -342 kkk 22 65 -407 sss 23 90 67 sss 24 36 31 sss 25 71 -40 ttt 26 69 43 ttt 27 32 11 (myrate列是预期的输出) 【参考方案1】:

试试这个。我添加了一个辅助函数来计算myrate。我没有检查名称,而是简单地将 df 按Name 拆分,对每个Name 进行计算,最后将它们绑定在一起。

# Example data

df <- data.frame(
  Name = c(rep("kkk", 3), rep("sss", 3), rep("ttt", 2)),
  Amt = c(20:27),
  Rupee = c(11, 333, 65, 90, 36, 71, 69, 32)
)
df
#>   Name Amt Rupee
#> 1  kkk  20    11
#> 2  kkk  21   333
#> 3  kkk  22    65
#> 4  sss  23    90
#> 5  sss  24    36
#> 6  sss  25    71
#> 7  ttt  26    69
#> 8  ttt  27    32

# Helper function
myrate <- function(df) 
  # Init myrate = 0
  df$myrate <- 0
  # Add id = row number
  df$id <- 1
  df$id <- cumsum(df$id)
  # Loop over id or rows
  for (i in df$id) 
    df$myrate[i] <- 
      if (i == 1) 
        df$Rupee[i] - df$Amt[i]
       else 
        df$myrate[i] <- df$myrate[i - 1] - df$Rupee[i]
      
  
  df["id"] <- NULL
  df


# Computation
library(dplyr)

df %>% 
  # Split by Name
  split(.$Name) %>%
  # Compute myrate for each Name
  lapply(myrate) %>%
  # Bind back in one df
  bind_rows()
#>   Name Amt Rupee myrate
#> 1  kkk  20    11     -9
#> 2  kkk  21   333   -342
#> 3  kkk  22    65   -407
#> 4  sss  23    90     67
#> 5  sss  24    36     31
#> 6  sss  25    71    -40
#> 7  ttt  26    69     43
#> 8  ttt  27    32     11

由reprex package (v0.3.0) 于 2020 年 4 月 5 日创建

【讨论】:

亲爱的 Stefan,感谢您的回复,只是一个疑问,如果表格中的行项目真的很大,比如几个 100 怎么办..在这种情况下也请提供帮助 嗨,Shailesh。当您用bigtable 标记您的问题时,我意识到使用 for 循环可能不是最好的解决方案。一般来说,它应该适用于一张大桌子,但它可能很慢。从这个意义上说,这只是如何实现算法的第一步。不幸的是,目前我没有快速解决方案来摆脱循环。因此,我建议您在我的第一步基础上,提出第二个精炼的问题,即如何在不需要 for 循环的情况下实现算法。 亲爱的 Stefan, 感谢您花时间和精力帮助我。非常感谢

以上是关于R中是不是有一种方法,如果一列的值满足另一列中的某个标准,则该列的值应该是上面的值的主要内容,如果未能解决你的问题,请参考以下文章

检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中

根据另一列中的值从一列中减去值(SQL)

R:基于一个列的值存在于另一列中,生成虚拟变量

如果同一行中另一列中的值匹配,如何比较列的两个值

excel中判断一个表中的某一列的数据在另一个表中的某一列中是不是存在

如何获得DataGridView中某一列中全部的值?