Reputation: 243
i have the following data frame, containing three groups and two values within a group:
df <- data.frame(var1 = c("A","A","B","B","C","C"),
var2 = c(0,1,1,1,2,1)
)
I want to compare them for each line based on the second within the group and add a column with characters. There are some possibilities (i think) for each line:
df$var2[1] < df$var2[2] # if TRUE write "N"
df$var2[1] > df$var2[2] # if TRUE write "S"
df$var2[1] == df$var2[2] # if TRUE write "U"
df$var2[2] < df$var2[1] # if TRUE write "N"
df$var2[2] > df$var2[1] # if TRUE write "S"
df$var2[2] == df$var2[1] # if TRUE write "U"
I want to test that for each group in and add a column that mark the result:
df <- data.frame(var1 = c("A","A","B","B","C","C"),
var2 = c(0,1,1,1,2,1),
var3 = c("N","S","U","U","S","N")
)
Hope somebody can help!
Upvotes: 0
Views: 61
Reputation: 23608
Answer based on adjusted rules:
with dplyr:
library(dplyr)
df %>%
group_by( var1 ) %>%
mutate( var3 = case_when(
var2 < lead(var2) | var2 < lag(var2) ~ "N",
var2 > lead(var2) | var2 > lag(var2) ~ "S",
var2 == lead(var2) | var2 == lag(var2) ~ "U"
))
# A tibble: 6 x 3
# Groups: var1 [3]
var1 var2 var3
<fct> <dbl> <chr>
1 A 0 N
2 A 1 S
3 B 1 U
4 B 1 U
5 C 2 S
6 C 1 N
with data.table:
library(data.table)
dt <- setDT(df)
dt[, var3 := ifelse(var2 < shift(var2, n=1L, fill=0, type="lead") | var2 < shift(var2, n=1L, fill=0, type="lag"),
"N",
ifelse(var2 == shift(var2, n=1L, fill=0, type="lead") | var2 == shift(var2, n=1L, fill=0, type="lag"),
"U",
"S" )),
by = var1]
dt
var1 var2 var3
1: A 0 N
2: A 1 S
3: B 1 U
4: B 1 U
5: C 2 S
6: C 1 N
Upvotes: 1