【问题标题】:Create column based on ordering in another column in R基于R中另一列中的排序创建列
【发布时间】:2020-06-24 11:44:56
【问题描述】:

我有一个更长版本的数据框:

council_name <- c("Southwark", "Southwark", "Southwark", "Lambeth", "Lambeth", "Lambeth", "Yorkshire", "Yorkshire", "Yorkshire")
quarter <- c("2006 Q1", "2006 Q2", "2006 Q3", "2006 Q1", "2006 Q2", "2006 Q3","2006 Q1", "2006 Q2", "2006 Q3")
treat <- c(1, 0, 1, 0, 0, 1, 0, 0, 0)
df.desired <- as.data.frame(c(council_name, as.yearqtr(quarter), treat, df, first.treatment))

当“治疗”第一次为“理事会名称”的每个值时,我想要一个值为“季度”的列。如果对于特定的委员会名称,“治疗”从不为 1,则为“0”。

这会是这样的:

library(zoo)
council_name <- c("Southwark", "Southwark", "Southwark", "Lambeth", "Lambeth", "Lambeth", "Yorkshire", "Yorkshire", "Yorkshire")
quarter <- c("2006 Q1", "2006 Q2", "2006 Q3", "2006 Q1", "2006 Q2", "2006 Q3","2006 Q1", "2006 Q2", "2006 Q3")
treat <- c(1, 0, 1, 0, 0, 1, 0, 0, 0)
first.treatment <- c("2006 Q1", "2006 Q3", 0)
df.desired <- as.data.frame <- c(council_name, as.yearqtr(quarter), treat, df, first.treatment)

我用 group_by 和排序尝试了不同的东西,但我从来没有完全得到我要找的东西。

我尝试过的一个例子是:

merged2%>%
  group_by(council_name, year_qtr)%>%
  arrange(year_qtr)%>%
  mutate(first.treatment = by(year_qtr, head, 1))

但是得到了:

Error: Problem with `mutate()` input `first.treatment`. x unique() applies only to vectors ℹ Input `first.treatment` is `by(year_qtr, head, 1)`. ℹ The error occured in group 1: council_name = "Adur", year_qtr = 2006 Q2.

非常感谢!

【问题讨论】:

  • "我用 group_by 尝试了不同的东西" - 请分享你的代码,即使它不起作用。
  • 你是对的。抱歉,编辑了它并包含了一个示例。
  • 你的例子正确吗?因为我运行它时得到一个列表,而不是数据框
  • 抱歉,现在更正了

标签: r dataframe dplyr tidyverse zoo


【解决方案1】:

使用group_by 时,mutate 调用将依次考虑所有组中的每个变量。

因此,你可以这样写:

tibble(council_name, year_qtr=as.yearqtr(quarter), treat) %>% 
  group_by(council_name) %>% 
  arrange(year_qtr) %>% 
  mutate(first_treatment = year_qtr[treat==1][1]) %>% 
  arrange(council_name, year_qtr)

tibble(council_name, year_qtr=as.yearqtr(quarter), treat) %>% 
  group_by(council_name) %>% 
  arrange(year_qtr) %>% 
  summarise(first_treatment = year_qtr[treat==1][1])

对于每个组,这要求year_qtr 列在treat==1 所在的位置,并获取结果向量的第一个值。这就是为什么事先排序很重要 (arrange)。

【讨论】:

    【解决方案2】:

    我确实对示例数据进行了一些调整,但我非常希望,这就是你的意思。 我不喜欢返回字符串或0 的想法。应该始终返回相同的数据类型。这就是为什么我的回答返回quarterNA。如果您坚持返回 0 可以使用 is.na 轻松“修复”。

    council_name <- c("Southwark", "Southwark", "Southwark", "Lambeth", "Lambeth", "Lambeth", "Yorkshire", "Yorkshire", "Yorkshire")
    quarter <- c("2006 Q1", "2006 Q2", "2006 Q3", "2006 Q1", "2006 Q2", "2006 Q3","2006 Q1", "2006 Q2", "2006 Q3")
    treat <- c(1, 0, 1, 0, 0, 1, 0, 0, 0)
    df <- data.frame(council_name, quarter, treat)
    
    treat.one <- function(d){
      line <- which(d$treat == 1)[1]
      return(d$quarter[line])
    }
    
    by(df, council_name, treat.one)
    

    这需要

      council_name quarter treat
    1    Southwark 2006 Q1     1
    2    Southwark 2006 Q2     0
    3    Southwark 2006 Q3     1
    4      Lambeth 2006 Q1     0
    5      Lambeth 2006 Q2     0
    6      Lambeth 2006 Q3     1
    7    Yorkshire 2006 Q1     0
    8    Yorkshire 2006 Q2     0
    9    Yorkshire 2006 Q3     0
    

    然后返回

    > by(df, council_name, treat.one)
    council_name: Lambeth
    [1] "2006 Q3"
    ----------------------------------------- 
    council_name: Southwark
    [1] "2006 Q1"
    ----------------------------------------- 
    council_name: Yorkshire
    [1] NA
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多