gpt4 book ai didi

r - 在数据框中交换行和排序

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

我发现在 R 中对数据框中的某些行进行排序有点棘手。数据具有以下结构。

df <- 
ID TIME DVID AMT DV PERIOD
1 0 0 50 NA 1
1 0.5 1 0 10 1
1 0.5 2 0 15 1
2 600 0 100 NA 2
2 600 1 0 2.5 2
2 600 2 0 4 2
2 602 1 0 20 2
2 602 2 0 35 2
3 800 0 50 NA 3
3 800 1 0 5 3
3 800 2 0 10 3

对于 PERIOD >= 2我想将 DVID 的行交换为 DVID 1、2,然后是 0,如下面的输出数据框 dfout .数据也必须按 ID、TIME、PERIOD 排序。

我尝试使用 orderBy但可以达到我的目标。使用 orderBy 的示例这是。
library(doBy)
dfout <- orderBy(~ID+TIME+PERIOD, data=df)

输出应该是这样的:
dfout <- 
ID TIME DVID AMT DV PERIOD
1 0 0 50 NA 1
1 0.5 1 0 10 1
1 0.5 2 0 15 1
2 600 1 0 2.5 2
2 600 2 0 4 2
2 600 0 100 NA 2
2 602 1 0 20 2
2 602 2 0 35 2
3 800 1 0 5 3
3 800 2 0 10 3
3 800 0 50 NA 3

如果有人分享如何在 R 中做到这一点的技巧,我将不胜感激。

最佳答案

我们可以在没有任何组的情况下做到这一点,这样做应该会更快。

library(dplyr)
df %>%
arrange(ID, PERIOD, TIME, replace(DVID, PERIOD > 1 & DVID==0, 3))
# ID TIME DVID AMT DV PERIOD
#1 1 0.0 0 50 NA 1
#2 1 0.5 1 0 10.0 1
#3 1 0.5 2 0 15.0 1
#4 2 600.0 1 0 2.5 2
#5 2 600.0 2 0 4.0 2
#6 2 600.0 0 100 NA 2
#7 2 602.0 1 0 20.0 2
#8 2 602.0 2 0 35.0 2
#9 3 800.0 1 0 5.0 3
#10 3 800.0 2 0 10.0 3
#11 3 800.0 0 50 NA 3

或使用 data.table
library(data.table)
setDT(df)[PERIOD > 1 & DVID==0, DVID1:= 3][order(ID, TIME, PERIOD,
pmax(DVID, DVID1, na.rm=TRUE))][, DVID1 := NULL][]

或使用 base R
df[order(df$ID, df$PERIOD, df$TIME, with(df, replace(DVID,PERIOD>1 & DVID ==0, 3))),]
# ID TIME DVID AMT DV PERIOD
#1 1 0.0 0 50 NA 1
#2 1 0.5 1 0 10.0 1
#3 1 0.5 2 0 15.0 1
#5 2 600.0 1 0 2.5 2
#6 2 600.0 2 0 4.0 2
#4 2 600.0 0 100 NA 2
#7 2 602.0 1 0 20.0 2
#8 2 602.0 2 0 35.0 2
#10 3 800.0 1 0 5.0 3
#11 3 800.0 2 0 10.0 3
#9 3 800.0 0 50 NA 3

关于r - 在数据框中交换行和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902988/

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