根据R中另一列的顺序创建列

时间:2020-06-24 11:44:56

标签: r dataframe dplyr tidyverse 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)
df.desired <- as.data.frame(c(council_name, as.yearqtr(quarter), treat, df, first.treatment))

我想要的是对于“ council_name”的每个值首次将“处理”设为1时具有“季度”值的列。如果特定的Council_name的“待遇”从不为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和sort尝试了不同的方法,但是我从没有得到想要的东西。

我尝试过的一个例子是:

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.

非常感谢!

2 个答案:

答案 0 :(得分:1)

我确实修改了示例数据,但是我很希望,这就是您的意思。 我不喜欢返回字符串或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

答案 1 :(得分: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的{​​{1}}列,并采用结果向量的第一个值。这就是为什么预先排序(treat==1)的重要性。