题
使用dplyr
,如何在一个语句中选择分组数据的顶部和底部观察/行?
数据和示例
给定一个数据框架
df <- data.frame(id=c(1,1,1,2,2,2,3,3,3),
stopId=c("a","b","c","a","b","c","a","b","c"),
stopSequence=c(1,2,3,3,1,4,3,1,2))
Run Code Online (Sandbox Code Playgroud)
我可以使用每个组的顶部和底部观察结果slice
,但使用两个单独的语句:
firstStop <- df %>%
group_by(id) %>%
arrange(stopSequence) %>%
slice(1) %>%
ungroup
lastStop <- df %>%
group_by(id) %>%
arrange(stopSequence) %>%
slice(n()) %>%
ungroup
Run Code Online (Sandbox Code Playgroud)
我可以将这两个statmenets合并成一个选择两个顶部和底部的意见?
我有一个随着时间推移接触表面的data.frame。我只想为每个AcvitivityID附加最后一行的副本:
head(movsdf.rbind)
ActivityID CareType HCWType Orientation Surface Date Time Dev.Date.Time SurfaceCategories
1 01 IV RN01 leftFacing AlcOutside 2019-08-03 11:08:01 2019-08-03 11:08:01 HygieneArea
2 01 IV RN01 leftFacing In 2019-08-03 11:08:12 2019-08-03 11:08:12 In
3 01 IV RN01 leftFacing Door 2019-08-03 11:08:12 2019-08-03 11:08:12 FarPatient
4 02 IV RN01 leftFacing Door 2019-08-03 11:08:18 2019-08-03 11:08:18 FarPatient
5 02 IV RN01 leftFacing Other 2019-08-03 11:08:22 2019-08-03 11:08:22 FarPatient
6 03 IV RN01 leftFacing Table 2019-08-03 11:10:26 2019-08-03 11:10:26 NearPatient
Run Code Online (Sandbox Code Playgroud)
示例数据:
movsdf.rbind<-data.frame(ActivityID=rep(1:4, each=10),Surface=rep(c("In","Table","Out"),each=10)) …
Run Code Online (Sandbox Code Playgroud) 我将非常感谢以下任务的一些帮助:从下面的数据框(C
)中,对于每个id,我想d_2
从最终条目中减去列下的第一个条目,然后将结果存储在包含相同ID的另一个数据框中.然后我可以将它与我的初始数据帧合并.请注意,减法必须按此顺序排列(最后一个条目减去每个条目的第一个条目id
).
以下是代码:
id <- c("A1", "A1", "B10","B10", "B500", "B500", "C100", "C100", "C100", "D40", "D40", "G100", "G100")
d_1 <- c( rep(1.15, 2), rep(1.44, 2), rep(1.34, 2), rep(1.50, 3), rep(1.90, 2), rep(1.59, 2))
set.seed(2)
d_2 <- round(runif(13, -1, 1), 2)
C <- data.frame(id, d_1, d_2)
id d_1 d_2
A1 1.15 -0.63
A1 1.15 0.40
B10 1.44 0.15
B10 1.44 -0.66
B500 1.34 0.89
B500 1.34 0.89
C100 1.50 -0.74
C100 1.50 0.67
C100 1.50 -0.06
D40 …
Run Code Online (Sandbox Code Playgroud) 我有一个类似于以下的数据集。
\n\nCase <- c("A", "B", "C", "A", "B", "C", "A", "B", "C")\nObservationNumber <- c(1, 1, 1, 2, 2, 2, 3, 3, 3)\nObservedValue <- c(154, 152, 157, 173, 176, 171, 203, 205, 199)\n
Run Code Online (Sandbox Code Playgroud)\n\n我正在尝试创建一个新的数据框,其中一列是案例(A、B 或 C),第二列是从第一次观察到第三次观察的观察值的变化。行数就是不同案例的数量(上例中为 3 行,但实际数据集中为数百行)。
\n\n有一些解决方法可以适用于示例数据,但我的真实数据有数百个案例,每个案例有 50 个观察值。因此,我需要某种方法来做到这一点,不需要(1)为每个案例创建一个单独的数据集(例如通过过滤)来执行减法,这是我能够想出的唯一方法自己的。
\n\n有没有人有其他想法来做到这一点?
\n\n**此外,在示例中,行是按顺序排列的,但在真实数据集中,它们不是按顺序排列的。因此,我可以\xe2\x80\x99t只取每组中的第一行和最后一行;我需要获取每组中具有最大值和最小值的行。下面的两个答案都很好地解决了这个问题。
\n我有一些结构类似于的数据:
a <- data.frame("ID" = c("A", "A", "B", "B", "C", "C"),
"NUM" = c(1, 2, 4, 3, 6, 9),
"VAL" = c(1, 0, 1, 0, 1, 0))
Run Code Online (Sandbox Code Playgroud)
我正在尝试对其进行排序ID
,NUM
然后获取最后一行。此代码用于获取最后一行并将其汇总为唯一 ID,但是,它实际上并没有像我想要的那样获取完整的最后一行。
a <- a %>% arrange(ID, NUM) %>%
group_by(ID) %>%
summarise(max(NUM))
Run Code Online (Sandbox Code Playgroud)
我明白为什么这段代码不起作用,但我正在寻找dplyr
获取每个唯一的最后一行的方法ID
预期成绩:
ID NUM VAL
<fct <dbl> <dbl>
1 A 2 0
2 B 4 1
3 C 9 0
Run Code Online (Sandbox Code Playgroud)
注意:我承认,虽然它几乎是Select first and last row from grouped data的副本,但该线程上的答案并不是我想要的。