这是我的数据
{{1}}
我想遍历每个ID,并为每个ID较大的值创建一个新列(“状态”),将其称为“高”,对于较低的值创建一个新列(“状态”),将其称为“低”。
最好的方法是什么?
答案 0 :(得分:2)
使用R base
> transform(df1, state = ave(dist, ID, FUN= function(x)ifelse(x==max(x), "high", "low")))
ID dist state
1 1 23 high
2 1 10 low
3 2 12 low
4 2 20 high
5 3 14 low
6 3 33 high
答案 1 :(得分:0)
我们可以使用max/min
library(dplyr)
df1 %>%
group_by(ID) %>%
mutate(state = case_when(dist == max(dist) ~ "high",
dist == min(dist) ~ "low",
TRUE ~ NA_character_))
由于每个“ ID”都有两个值,因此不需要第二个条件
df1 %>%
group_by(ID) %>%
mutate(state = case_when(dist == max(dist) ~ "high",
TRUE ~"low"))
df1 <- structure(list(ID = c(1L, 1L, 2L, 2L, 3L, 3L), dist = c(23L,
10L, 12L, 20L, 14L, 33L)), class = "data.frame", row.names = c(NA,
-6L))
答案 2 :(得分:0)
带有data.table ...
library(data.table)
setDT(DF)
DF[order(ID, dist), v := c("lo", "hi")]
ID dist v
1: 1 23 hi
2: 1 10 lo
3: 2 12 lo
4: 2 20 hi
5: 3 14 lo
6: 3 33 hi