当前位置: 首页 > 知识库问答 >
问题:

根据 R 中的先前值填写列

越麒
2023-03-14

我正在寻找一个整洁的解决以下问题。

我有以下示例数据集:

ex_tbl <- tibble(col1 = c(5, NA, NA, NA), col2 = c(1, 1.3, 0.8, 1.2))

我需要根据列2和列1中的前一个值填写NAs。如果我从第一个NA(第1列,第2行)开始,并且第2列大于1,那么我将把第1列的值(第1行)乘以第2列的值。那么如果col2小于等于1,那么col1正好等于前面的值。

这应该是最终结果:

  col1  col2
     5   1  
    6.5  1.3
    6.5  0.8
    7.8  1.2

我尝试了case_when()但没有得到想要的结果:

output <- ex_tbl %>% mutate(col1 = case_when(col2 > 1 ~ col1 * col2,
                                              col2 <= 1 ~ col1,
                                              TRUE ~ col1)

显然,我没有捕获我想要使用前一行的值的部分。任何帮助都将不胜感激。

共有2个答案

东门楚
2023-03-14

我们可能需要在这里累积

library(dplyr)
library(purrr)
ex_tbl %>% 
   mutate(coln = accumulate(col2, ~  if(.y <= 1) .x else .x * .y , 
         .init = first(col1))[-1])

-输出

# A tibble: 4 × 3
   col1  col2  coln
  <dbl> <dbl> <dbl>
1     5   1     5  
2    NA   1.3   6.5
3    NA   0.8   6.5
4    NA   1.2   7.8
宗政金鹏
2023-03-14

也许你可以用

library(dplyr)

ex_tbl %>% 
  mutate(col1 = first(col1) * cumprod(pmax(col2, 1)))

要得到

# A tibble: 4 x 2
   col1  col2
  <dbl> <dbl>
1   5     1  
2   6.5   1.3
3   6.5   0.8
4   7.8   1.2

如果您想在< code>col2的情况下乘以第三列的值

ex_tbl <- tibble(col1 = c(5, NA, NA, NA), col2 = c(1, 1.3, 0.8, 1.2), col3 = c(0.5, 2, 2, 0.3))

ex_tbl %>% 
  mutate(
    factor = (col2 >= 1) * col2 + (col2 < 1) * col3,
    col1 = first(col1) * cumprod((col2 >= 1) * col2 + (col2 < 1) * col3))

注意:这里的factor列不是必需的。它只是显示cumprod函数内部发生的事情。

 类似资料:
  • 问题内容: 我有这样的MySQL表 区域表 … 和学校表 我的注册表中有多个选择(下拉)菜单。区域下拉列表如下所示 我想做的是,获取“区域” ID,然后基于“学校”表中的ID(先前选择的ID)填充学校下拉菜单。我是JS的新手。请帮助我修复它。提前谢谢。 问题答案:

  • 我正在尝试计算多个列的中值,但是我的数据有点奇怪。它看起来像下面的示例。 在表中到列表示该值的出现次数。我想计算中位数的出现次数。 例如对于ID = 1 是我想要创建的计算。 对于ID=2 我尝试过使用<code>rep()或<code>rep(10,2)),这就是我所期望的。我只是努力创建一个列表或向量,每个列都有重复。

  • 我有一张800万行的大桌子。此表有15列带有数值,但这些值只能是0,并且只能是该列特有的另一个数值。我想根据特定值为这些列中的每一列创建两个新列。这些新值总是特定于列。 这是我的数据外观的虚拟示例: 这是我想要的输出 对应关系始终相同,即中1的值为,中2的值为,中3的值为。 我知道我可以用这样的东西 但我的真实数据有15列,需要大量的复制粘贴,有没有干净的方法?

  • 我在 df 中有三列 我想在col1=x时执行以下操作,存储col2和col3的值,并在col1=y预期输出时将这些列值分配给下一行 任何帮助将不胜感激 注意:-火花 1.6

  • 我想在两栏中填入缺少的值。根据预定义的类别1的最后日期(在先前填充的行中预定义),存在日期,类别2应填充另一行的值,例如: 数据示例: 因此,应根据< code>Cat1列- 中< code>cat值的最后存在日期,填写< code>Date列的< code>NaN。< code>Cat2列中的< code>NaN应由< code>mouse填写,作为已经为< code > Date -< cod

  • 我有一个带有几列的。其中一列包含使用货币的符号,例如欧元或美元符号。另一列包含预算值。例如,在一行中,它可能意味着5000欧元的预算,而在下一行中,它可能意味着2000美元的预算。 在熊猫我想添加一个额外的列到我的DataFrame,正常化的欧元预算。所以基本上,对于每一行,如果货币列中的符号是欧元符号,新列中的值应该是预算列中的值*1,新列中的值应该是预算列的值*0.78125如果货币栏中的符号