gpt4 book ai didi

R 函数,用于将列重新格式化为指示起点和终点的行

转载 作者:行者123 更新时间:2023-12-05 09:37:00 25 4
gpt4 key购买 nike

我正在尝试在 R 中找出一种方法来重新格式化我的数据框,以便具有 2 个或更多停靠点(区域)的 Veh 列在自己的行中表示,并重复区域 2 作为新的起点。作为 R 的新手,我不知道如何去做这件事。任何帮助将不胜感激。

例如,id喜欢转换这个

ID  Veh   Area 1    Area 2  Area 3   Area 4
1 Veh 1 Area A Area B NA NA
2 Veh 2 Area C NA NA NA
3 Veh 3 Area D Area A NA NA
4 Veh 4 Area E Area F Area D Area A
5 Veh 5 Area H Area B Area C NA
6 Veh 6 Area J Area K Area A Area B

进入此:

ID  Veh    Start_Area  Stop_Area
1 Veh 1 Area A Area B
2 Veh 2 Area C Area C
3 Veh 3 Area D Area A
4 Veh 4 Area E Area F
5 Veh 4 Area F Area G
6 Veh 4 Area D Area A
7 Veh 5 Area H Area B
8 Veh 5 Area B Area C
9 Veh 6 Area J Area K
10 Veh 6 Area K Area F
11 Veh 6 Area A Area B

然后计算每对的频率

最佳答案

我们可以使用base R去做这个。使用 apply 循环遍历行( MARGIN = 1 ) 与列的子集,即删除第一两列(不需要),然后我们删除 NA在行 ( na.omit ), if length所得向量的值为 1,则创建 data.frame两列都作为该值或 else ,删除第一个和最后一个值以创建“Stop_Area”、“Start_Area”。输出将是 list 。然后,我们rep根据此 list 的行数复制原始数据集的行,以及 cbind它与 list cbind编辑

lst1 <- apply(df1[-(1:2)], 1, function(x) {
x1 <- na.omit(x)
if(length(x1) == 1) data.frame(StartArea = x1, Stop_Area = x1) else
data.frame(StartArea = x1[-length(x1)], Stop_Area = x1[-1])
})

out <- cbind(df1[1:2][rep(seq_len(nrow(df1)),
sapply(lst1, nrow)),], do.call(rbind, lst1))
row.names(out) <- NULL

-输出

out
# ID Veh StartArea Stop_Area
#1 1 Veh 1 Area A Area B
#2 2 Veh 2 Area C Area C
#3 3 Veh 3 Area D Area A
#4 4 Veh 4 Area E Area F
#5 4 Veh 4 Area F Area D
#6 4 Veh 4 Area D Area A
#7 5 Veh 5 Area H Area B
#8 5 Veh 5 Area B Area C
#9 6 Veh 6 Area J Area K
#10 6 Veh 6 Area K Area A
#11 6 Veh 6 Area A Area B

数据

df1 <- structure(list(ID = 1:6, Veh = c("Veh 1", "Veh 2", "Veh 3", "Veh 4", 
"Veh 5", "Veh 6"), Area1 = c("Area A", "Area C", "Area D", "Area E",
"Area H", "Area J"), Area2 = c("Area B", NA, "Area A", "Area F",
"Area B", "Area K"), Area3 = c(NA, NA, NA, "Area D", "Area C",
"Area A"), Area4 = c(NA, NA, NA, "Area A", NA, "Area B")),
class = "data.frame", row.names = c(NA,
-6L))

关于R 函数,用于将列重新格式化为指示起点和终点的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64600993/

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