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中是不是有一种方法,如果一列的值满足另一列中的某个标准,则该列的值应该是上面的值的主要内容,如果未能解决你的问题,请参考以下文章
检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中