检查一行中的内容是否等于第一个出现的值,如果是,则记录ID:如何在R中自动实现?
Check whether the content in one row equals to the first appeared value, if so, record ID: how to achieve this in R automatically?
我在 R 中将人们的旅行记录作为数据框。如下所示:
t_participant_id t_destination_PostCode tripReasonString tripSequence
1 304 1082 work 1
2 304 1000 work 2
3 304 1000 work 3
4 304 1000 other 4
5 304 1000 other 5
6 304 1082 other 6
7 304 1082 home 7
8 362 1070 shopping 1
9 362 1070 work 2
10 362 1070 work 3
11 362 1070 shopping 4
12 362 1180 home 5
13 362 1070 leisure 6
14 362 1180 home 7
15 482 2800 work 1
16 482 2800 work 2
17 482 1020 home 3
基本上,t_participant_id
是一个人的唯一ID,tripReason
是人们旅行的原因,t_destination_postcode
是他们要去的地区(例如,在第 1 行,人 304
前往区域 1082
work
)。
不同的人在一天内有不同的出行次数(304
和 362
总共有 7 次出行,而 482
有 3 次。我想过滤掉t_destination_PostCode
出差目的work
与此人activity链下其他工作出差相同的人
简而言之,对于304
来说,他的第一次工作旅行是在1号线,然后去1082
地区。下一次出差是2号线,去1000
区。所以我知道他不是我想过滤掉的人。但是,对于 362
人,他在 tripSequence == 2
有第一个 work
activity,前往 1070
。下一个 work
行程在 tripSequence
3,也到 1070。activity 链中不再有其他工作行程。所以在这种情况下,我们想过滤掉人362
,并记录第一个作品tripSequence
,即2.
所以最终的结果应该是一个数据框
t_participant_id firstWorkTrip
362 2
482 1
我真的不想手动执行此操作,但不确定如何在 R 中实现此操作。非常感谢您的提前帮助!
这是数据框的代表
test <- data.frame(list(t_participant_id = c(304L, 304L, 304L, 304L, 304L,
304L, 304L, 362L, 362L, 362L, 362L, 362L, 362L, 362L, 482L, 482L,
482L), t_destination_PostCode = c(1082L, 1000L, 1000L, 1000L,
1000L, 1082L, 1082L, 1070L, 1070L, 1070L, 1070L, 1180L, 1070L,
1180L, 2800L, 2800L, 1020L), tripReasonString = c("work", "work",
"work", "other", "other", "other", "home", "shopping", "work",
"work", "shopping", "home", "leisure", "home", "work", "work",
"home"), tripSequence = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L,
3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L)))
df %>%
filter(tripReasonString == "work") %>%
group_by(t_participant_id) %>%
filter(n_distinct(t_destination_PostCode) == 1) %>%
summarize(first_work_trip = min(tripSequence))
# # A tibble: 2 × 2
# t_participant_id first_work_trip
# <int> <int>
# 1 362 2
# 2 482 1
我在 R 中将人们的旅行记录作为数据框。如下所示:
t_participant_id t_destination_PostCode tripReasonString tripSequence
1 304 1082 work 1
2 304 1000 work 2
3 304 1000 work 3
4 304 1000 other 4
5 304 1000 other 5
6 304 1082 other 6
7 304 1082 home 7
8 362 1070 shopping 1
9 362 1070 work 2
10 362 1070 work 3
11 362 1070 shopping 4
12 362 1180 home 5
13 362 1070 leisure 6
14 362 1180 home 7
15 482 2800 work 1
16 482 2800 work 2
17 482 1020 home 3
基本上,t_participant_id
是一个人的唯一ID,tripReason
是人们旅行的原因,t_destination_postcode
是他们要去的地区(例如,在第 1 行,人 304
前往区域 1082
work
)。
不同的人在一天内有不同的出行次数(304
和 362
总共有 7 次出行,而 482
有 3 次。我想过滤掉t_destination_PostCode
出差目的work
与此人activity链下其他工作出差相同的人
简而言之,对于304
来说,他的第一次工作旅行是在1号线,然后去1082
地区。下一次出差是2号线,去1000
区。所以我知道他不是我想过滤掉的人。但是,对于 362
人,他在 tripSequence == 2
有第一个 work
activity,前往 1070
。下一个 work
行程在 tripSequence
3,也到 1070。activity 链中不再有其他工作行程。所以在这种情况下,我们想过滤掉人362
,并记录第一个作品tripSequence
,即2.
所以最终的结果应该是一个数据框
t_participant_id firstWorkTrip
362 2
482 1
我真的不想手动执行此操作,但不确定如何在 R 中实现此操作。非常感谢您的提前帮助!
这是数据框的代表
test <- data.frame(list(t_participant_id = c(304L, 304L, 304L, 304L, 304L,
304L, 304L, 362L, 362L, 362L, 362L, 362L, 362L, 362L, 482L, 482L,
482L), t_destination_PostCode = c(1082L, 1000L, 1000L, 1000L,
1000L, 1082L, 1082L, 1070L, 1070L, 1070L, 1070L, 1180L, 1070L,
1180L, 2800L, 2800L, 1020L), tripReasonString = c("work", "work",
"work", "other", "other", "other", "home", "shopping", "work",
"work", "shopping", "home", "leisure", "home", "work", "work",
"home"), tripSequence = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L,
3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L)))
df %>%
filter(tripReasonString == "work") %>%
group_by(t_participant_id) %>%
filter(n_distinct(t_destination_PostCode) == 1) %>%
summarize(first_work_trip = min(tripSequence))
# # A tibble: 2 × 2
# t_participant_id first_work_trip
# <int> <int>
# 1 362 2
# 2 482 1