简体   繁体   中英

R: Duplicating a subset of row values, based on condition, across a whole dataframe

I have a dataframe df containing count data at different sites, across two days:

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

I would like to add a new column day1count that represents the count value at day 1, for each unique site. So, on rows where day==1 , count and day1count would be identical. The new df would look like:

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

So far I've created a new column that has duplicate values for day 1 rows, and NA for everything else:

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

How can I now replace the NA entries with values corresponding to each unique site from day 1?

I figured it out. It's not very elegant (and I invite others to submit a more efficient approach) but...

Do NOT create the new column with df$day1count= ifelse(df$day==1, df$count, NA) as I did in the original example. Instead, start by making a duplicate of df , but which only contains rows from day 1

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

Rename count as day1count , and remove day column

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

Merge the two dataframes by site

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

With tidyverse you could do the following:

library(tidyverse)

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

Output

# 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

Data

df <- read.table(
  text =
    "day   site   count
1     A      2
1     B      3
2     A      10
2     B      12", header = T
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM