【问题标题】:Apply different functions to every nth row对每 n 行应用不同的函数
【发布时间】:2021-03-15 15:49:56
【问题描述】:

我有一个大数据框:

age<- c(25,25,25,25,25,30,30,30,30,30)
pop<-c(1000,1000,1000,1000,1000,800,800,800,800,800)
df<-rbind(age,pop)

实际上,我在同一个数据框中多次迭代了这个结构(对于每个性别和年份)。 我想要做的是,从每 5 日开始将年龄等级更改为递增的数字。排。要这样:

age<- c(25,26,27,28,29,30,31,32,33,34)
pop<-c(1000,1000,1000,1000,1000,800,800,800,800,800)
df_new<-rbind(age,pop)

我的想法即将申请年龄+0,年龄+1,年龄+2,年龄+3,年龄+4;到第 1、2、3、4、5 行的每个倍数。 我尝试了嵌套循环或 lapply,但没有任何效果。

【问题讨论】:

    标签: r nested-loops lapply


    【解决方案1】:

    这行得通吗:

    library(dplyr)
    t(df) %>% as_tibble() %>% group_by(age) %>% 
                   mutate(age = age+0:(n()-1)) %>% ungroup() %>% as.matrix(df) %>% t()
        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    age   25   26   27   28   29   30   31   32   33    34
    pop 1000 1000 1000 1000 1000  800  800  800  800   800
    

    【讨论】:

    • 我刚刚将示例数据设为矩阵。这是错误的。我尝试了你的建议,并通过函数 ``` %>% group_by(age, year, sex) %>% mutate(age = age+0:(n()-1)) 将我的性别和年份列添加到组中``` 这也很好。非常感谢!
    【解决方案2】:

    我认为您的数据应该采用这种格式。

    age<- c(25,25,25,25,25,30,30,30,30,30)
    pop<-c(1000,1000,1000,1000,1000,800,800,800,800,800)
    df<-data.frame(age,pop)
    

    你可以使用seq函数。

    library(dplyr)
    df %>% mutate(age = seq(min(age), length.out = n()))
    
    #   age  pop
    #1   25 1000
    #2   26 1000
    #3   27 1000
    #4   28 1000
    #5   29 1000
    #6   30  800
    #7   31  800
    #8   32  800
    #9   33  800
    #10  34  800
    

    如果您想为每个 sexyear 变量执行此操作,您可以将它们添加到 group_by 中:

    df %>% group_by(sex, year) %>% mutate(age = seq(min(age), length.out = n()))
    

    【讨论】:

    • 我最后一个按性别和年份分组,它对整个数据框都很有效!非常感谢您的快速答复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2017-05-21
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多