gpt4 book ai didi

r - (纵向数据)为每个 ID 创建具有最后一个值的新变量

转载 作者:行者123 更新时间:2023-12-04 15:38:29 24 4
gpt4 key购买 nike

我正在处理一个包含 ID、时间戳和值的纵向数据集。我想为每个人创建一个新变量,在每个人的行中保存该人的最后一个时间戳的值。例如,如果我的数据如下所示:

    ID Time Value
1 1:20 1
1 2:43 2
1 1:56 3
2 1:10 4
2 1:05 5

我想像这样创建一个新变量 Final_value:

    ID Time Value Final_value
1 1:20 1 2
1 2:43 2 2
1 1:56 3 2
2 1:10 4 4
2 1:05 5 4

我更喜欢使用 R 的内置方法。也许有一种方法可以使用“ave”函数来做到这一点?

最佳答案

这是一个带有 dplyr 的选项。按'ID'分组,从lubridate将'Time'转换为带有hm的时间类,得到最大值的索引(which.max ) 并根据该索引对“值”进行子集

library(dplyr)
library(lubridate)
df1 %>%
group_by(ID) %>%
mutate(Final_value = Value[which.max(as.numeric(hm(Time)))])
# A tibble: 5 x 4
# Groups: ID [2]
# ID Time Value Final_value
# <int> <chr> <int> <int>
#1 1 1:20 1 2
#2 1 2:43 2 2
#3 1 1:56 3 2
#4 2 1:10 4 4
#5 2 1:05 5 4

或者使用base R

df1$Final_value <- with(df1, Value[as.logical(ave(as.numeric(as.POSIXct(Time, 
format = '%H:%M')),
ID, FUN = function(x) x== max(x)))][ID])

或者另一种选择是根据“时间”和“ID”排序数据,然后使用ave获取last值>

i1 <- with(df1, order(ID, as.POSIXct(TIme, format = '%H:%M')))
with(df1[i1,], ave(Value, ID, FUN = function(x) x[length(x)]))

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L), Time = c("1:20", "2:43", 
"1:56", "1:10", "1:05"), Value = 1:5), class = "data.frame", row.names = c(NA,
-5L))

关于r - (纵向数据)为每个 ID 创建具有最后一个值的新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58921079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com