【问题标题】:Making a function ignore the first row in R使函数忽略R中的第一行
【发布时间】:2021-04-12 18:17:33
【问题描述】:

所以我有这张关于病毒及其感染/死亡/等的表格。这是我的代码和原始表格:

data <- clean_names(read.csv("Book1.csv"))
TableN <- data %>% mutate(PeopleInfected = Suseptible* 1/8) %>% mutate(PeopleDeadFromInfection = PeopleInfected * 1/8) %>%
mutate(ImmuneFromSmallpox = PeopleInfected - PeopleDeadFromInfection) 

        > head(TableN)
      age Susceptible PeopleInfected PeopleDeadFromInfection ImmuneFromSmallpox
    1   0      1300        162.500                20.31250          142.18750
    2   1      1000        125.000                15.62500          109.37500
    3   2       855        106.875                13.35938           93.51562
    4   3       798         99.750                12.46875           87.28125
    5   4       760         95.000                11.87500           83.12500
    6   5       732         91.500                11.43750           80.06250

有 1/8 的机会感染病毒,另外还有 1/8 的机会死于该病毒。活下来的人永远对病毒免疫。因此,我必须从“可疑”中减去“ImmuneFromSmallpox”列,以说明那些幸存下来并永远对病毒免疫的人。

表格应该是这样的:

> head(TableN)
  age Susceptible PeopleInfected PeopleDeadFromInfection ImmuneFromSmallpox
1   0      1300        162.500                20.31250          142.18750
2   1      858.8125    107.226                13.40335          93.82265
3   2      761.17735   95.1471                11.89339          83.25371

更清楚地说,我希望第一行保持不变,但我希望其他行发生变化。你推荐我使用什么功能?

【问题讨论】:

  • 为什么PeopleInfectedPeopleDeadFromInfectionImmuneFromSmallpox 中的值会改变您想要的输出?
  • 我正在考虑那些已经感染病毒的人。他们现在永远免疫它。以下是计算方法。记住,它的感染率是1/8,死亡率是1/8。对于 0 岁(新生儿)的人,1300 * 1/8 = 162.5 人被感染,20.3 人死亡。存活的 142.2 新生儿不再感染病毒,因此,我们从易感列中减去 142.2 人。请记住,对于 1 岁,它最初是 1000,所以我们得到 858.8125。对于 1 岁的儿童,1/8 被感染,1/8 死亡。对每个年龄重复计算。希望解释清楚!
  • @codermcgee 现在有很多答案向您展示了实现结果的许多不同方法。请点击每个答案开头旁边的 v 符号,接受您认为最有帮助的答案。谢谢!

标签: r


【解决方案1】:

您可以在第一个 ImmuneFromSmallpox 值上尝试replace,例如,

transform(
  df,
  survivors = survivors - replace(ImmuneFromSmallpox, 1, 0)
)

或逻辑值seq(nrow(df)) &gt; 1

transform(
  df,
  survivors = survivors - ImmuneFromSmallpox * (seq(nrow(df)) > 1)
)

给了

  age survivors PeopleInfected PeopleDeadFromInfection ImmuneFromSmallpox
1   0 1300.0000        162.500                20.31250          142.18750
2   1  890.6250        125.000                15.62500          109.37500
3   2  761.4844        106.875                13.35938           93.51562
4   3  710.7188         99.750                12.46875           87.28125
5   4  676.8750         95.000                11.87500           83.12500
6   5  651.9375         91.500                11.43750           80.06250

数据

> dput(df)
structure(list(age = 0:5, survivors = c(1300L, 1000L, 855L, 798L, 
760L, 732L), PeopleInfected = c(162.5, 125, 106.875, 99.75, 95,
91.5), PeopleDeadFromInfection = c(20.3125, 15.625, 13.35938,
12.46875, 11.875, 11.4375), ImmuneFromSmallpox = c(142.1875,
109.375, 93.51562, 87.28125, 83.125, 80.0625)), class = "data.frame", row.names = c("1",        
"2", "3", "4", "5", "6"))

【讨论】:

    【解决方案2】:

    一种方法是使用 case_when,就像在这个答案中一样。 dplyr mutate with conditional values.

    但老实说,我只是对它很客气,把最上面的那一行打断,然后变异其余的,然后将它们重新绑定在一起。可以使用data[2:nrow(data),] 获取除第一行之外的所有行。

    【讨论】:

      【解决方案3】:

      尝试子集:

      data <- clean_names(read.csv("Book1.csv"))
      
      data[-1,] <- data[-1,] %>% mutate(...) 
      

      在这里,用df[-1,] 对两边的data.frame 进行子集化意味着您只对除第一行之外的所有行进行操作。完成此操作后,您可以致电 data 以查看除第一行之外的所有内容都已更改。

      更一般地,您可以创建带有行号的向量来选择您想要处理的行。说,idx = c(1,3,5)。然后,data[idx,] 将从data 中提取第 1、3 和 5 行。 data[-1,] 中的减号是排除第一行的 R 简写。同样,如果您想选择特定的列,您可以使用data[, col_idx] 执行相同的操作。如果你的 data.frame 有明确的行名,那么你也可以像调用列一样调用那些。

      【讨论】:

        【解决方案4】:

        试试下面的:

        library(dplyr)
        
        TableN %>% 
          mutate(Susceptible = Susceptible - lag(ImmuneFromSmallpox, default = 0),
                 PeopleInfected = Susceptible* 1/8, 
                 PeopleDeadFromInfection = PeopleInfected * 1/8) -> TableN
        
        TableN
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-09
          • 2011-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多