Question:

下面的方法很管用,但有没有更好的"R方法"来达到类似的结果呢?我实际上是在try 根据用户定义的函数(目前仅使用循环)将组创建/分发到单个行项目中.

Example:

df1 <- data.frame(group = c("A", "B", "C"), 
              volume = c(200L, 45L, 104L)
              )
print(df1)
#>   group volume
#> 1     A    200
#> 2     B     45
#> 3     C    104

我希望根据组将volume分成多行,以便最终结果是一个数据帧,其中新卷(下图中的vol2)将与上面的原始卷相加.在本例中,我应用的是除数为52的整数数学,因此我的最终结果应该是:

print(df3)
#>    group vol2
#> 1      A   52
#> 2      A   52
#> 3      A   52
#> 4      A   44
#> 21     B   45
#> 31     C   52
#> 32     C   52

这很管用

下面的代码将使我获得上面所示的预期结果:

div <- 52L
df1$intgr <- df1$volume %/% div
df1$remainder <- df1$volume %% div

print(df1)
#>   group volume intgr remainder
#> 1     A    200     3        44
#> 2     B     45     0        45
#> 3     C    104     2         0

df2 <- data.frame()

for (r in 1:nrow(df1)){
  if(df1[r,"intgr"] > 0){
    for (k in 1:as.integer(df1[r,"intgr"])){
      df1[r,"vol2"] <- div
      df2 <- rbind(df2, df1[r,])
    }
  }
  if(df1[r,"remainder"]>0){
    df1[r, "vol2"] <- as.integer(df1[r, "remainder"])
    df2 <- rbind(df2, df1[r,])
  }
}

print(df2)
#>    group volume intgr remainder vol2
#> 1      A    200     3        44   52
#> 2      A    200     3        44   52
#> 3      A    200     3        44   52
#> 4      A    200     3        44   44
#> 21     B     45     0        45   45
#> 31     C    104     2         0   52
#> 32     C    104     2         0   52

df3 <- subset(df2, select = c("group", "vol2"))

print(df3)
#>    group vol2
#> 1      A   52
#> 2      A   52
#> 3      A   52
#> 4      A   44
#> 21     B   45
#> 31     C   52
#> 32     C   52

作为R的新手,我只是好奇是否有人知道更好的方法/函数/方法可以到达相同的位置.看起来可能有.我可能有一种更复杂的方法来分解行,我在想也许有一种方法可以将UDF应用到DataFrame来做这样的事情.我在搜索"扩展组/组",但找到的主要是"expand.grid",这不是我在这里要做的.

谢谢您的建议!

推荐答案

一个快速函数,帮助将每个数字除以模数,

fun <- function(num, mod) c(rep(mod, floor(num / mod)), (num-1) %% mod + 1)
fun(200, 52)
# [1] 52 52 52 44
fun(45, 52)
# [1] 45
fun(104, 52)
# [1] 52 52

我们可以通过多种方式来应用这一点:

dplyr

library(dplyr)
df1 %>%
  group_by(group) %>%
  summarize(vol2 = fun(volume, 52), .groups = "drop")
# # A tibble: 7 x 2
#   group  vol2
#   <chr> <dbl>
# 1 A        52
# 2 A        52
# 3 A        52
# 4 A        44
# 5 B        45
# 6 C        52
# 7 C        52

base R

do.call(rbind, by(df1, seq(nrow(df1)),
                  FUN = function(z) data.frame(group = z$group, vol2 = fun(z$volume, 52))))

data.table

library(data.table)
setDT(df1)
df1[, .(vol2 = fun(volume, 52)), by = group]

R相关问答推荐

如果列中存在相同的字符串,则对行值进行总和

使用R中的Shapetime裁剪格栅文件

如何求解arg必须为NULL或deSolve包的ode函数中的字符向量错误

名称输出pmap on tible

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

过滤器数据.基于两列的帧行和R中的外部向量

根据多个条件增加y轴高度以适应geom_text标签

自动变更列表

如何使下一个按钮只出现在Rshiny 的一段时间后?""

删除具有相同标题的tabPanel(shinly)

移除仪表板Quarto中顶盖和车身之间的白色区域

如何删除最后一个可操作对象

如何将一个方阵分解成没有循环的立方体

如何在PrePlot()中将多个元素设置为斜体

为R中的16组参数生成10000个样本的有效方法是什么?

有毒元素与表观遗传年龄的回归模型

如何在Quarto中使用美人鱼图表中的标记来加粗文本

在ggplot2图表中通过端点连接点

带查找数据的FCT_REORDER.帧

根据部分名称匹配获取多组列的行求和