R: Дублирование подмножества значений строки, основанных на условии, по всему фрейму данных - PullRequest
0 голосов
/ 26 марта 2020

У меня есть фрейм данных df, содержащий данные подсчета на разных сайтах за два дня:

day   site   count
1     A      2
1     B      3
2     A      10
2     B      12

Я хотел бы добавить новый столбец day1count, представляющий значение count в день 1, для каждого уникального сайта. Таким образом, в строках, где day==1, count и day1count будут идентичны. Новый df будет выглядеть следующим образом:

day   site   count   day1count
1     A      2       2
1     B      3       3
2     A      10      2
2     B      12      3

До сих пор я создал новый столбец, который имеет повторяющиеся значения для строк первого дня и NA для всего остального:

df$day1count= ifelse(df$day==1, df$count, NA)

day   site   count   day1count
1     A      2       2
1     B      3       3
2     A      10      NA
2     B      12      NA

Как теперь я могу заменить записи NA значениями, соответствующими каждому уникальному сайту с первого дня?

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

С tidyverse вы можете сделать следующее:

library(tidyverse)

df %>%
  group_by(site) %>%
  mutate(day1count = first(count))

Выход

# A tibble: 4 x 4
# Groups:   site [2]
    day site  count day1count
  <int> <fct> <int>     <int>
1     1 A         2         2
2     1 B         3         3
3     2 A        10         2
4     2 B        12         3

Данные

df <- read.table(
  text =
    "day   site   count
1     A      2
1     B      3
2     A      10
2     B      12", header = T
)
0 голосов
/ 26 марта 2020

Я понял это. Это не очень элегантно (и я приглашаю других представить более эффективный подход), но ...

НЕ создавайте новый столбец с df$day1count= ifelse(df$day==1, df$count, NA), как я делал в исходном примере. Вместо этого начните с создания дубликата df, который содержит только строки со дня 1

tmpdf = df[df$day==1,]

Переименуйте count в day1count и удалите day столбец

tmpdf = rename(tmpdf, c("count"="day1count"))
tmpdf$day = NULL

Объединить два кадра данных по сайту

newdf = merge(x=df,y=tmpdf, by="site")
newdf

  site day count day1count
1    A   1     2         2
2    A   2    10         2
3    B   1     3         3
4    B   2    12         3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...