【发布时间】:2018-09-25 15:58:14
【问题描述】:
这是我的数据:
ID dist
1 23
1 10
2 12
2 20
3 14
3 33
我想遍历每个 ID,并为每个 ID 的较大值创建一个新列(“状态”),将其称为“高”,对于较小的值,将其称为“低”。
最好的方法是什么?
【问题讨论】:
这是我的数据:
ID dist
1 23
1 10
2 12
2 20
3 14
3 33
我想遍历每个 ID,并为每个 ID 的较大值创建一个新列(“状态”),将其称为“高”,对于较小的值,将其称为“低”。
最好的方法是什么?
【问题讨论】:
使用 R 基础
> 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
【讨论】:
transform 内,则不需要df1$ 可以用transform(df1, state = c('low', 'high')[(ave(dist, ID, FUN = max) == dist) + 1]) 做得更紧凑一些
我们可以用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))
【讨论】:
使用 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
【讨论】: