我对R.
我有一个时间序列数据集(60k行),它也内置了一个类别。以下面的例子为例:表记录了从2001年到2009年的每一次公共汽车旅行。在这里输入图像描述
如果一个总线有多个行程,那么它就有多个具有相同总线号的行。每辆公共汽车的行程数是随机的。旅行的最少次数是一次。
我想将下面的数据帧重新构造成一个有n行的表,其中n等于唯一总线的数量,列显示每条总线穿越时间的顺序。
因此,新表中的第一行是bus1 stop 1 stop20 stop 2 stop 21。
表的第二排是公交2站4站23站5站25站6站25站7站26站8站27站。
由于这些公共汽车没有相同的行程,转换后的表/列表没有相同的列数。
我不知道重塑数据集的最佳方法是什么。我应该使用循环吗?
非常感谢
举下面的例子:
df <- data.frame(
transport = c("bus1", "bus1", "bus2", "bus2", "bus2",
"bus2", "bus2", "bus2", "bus3", "bus4", "bus4", "bus4",
"bus4", "bus4", "bus4", "bus4", "bus4", "bus4"),
travel_time = c(2001, 2002, 2001, 2002, 2003,
2004, 2005, 2006, 2001, 2001,2002,2003,
2004,2005,2006,2007,2008,2009),
from = paste("stop",seq(1,18)),
to = paste("stop",seq(20,37))
)发布于 2022-02-05 21:43:55
现在还不清楚你想要什么形式,你想要的输出是什么-所以这可能不会给你确切的你想要的。(这在刚接触R的人中很常见,就像任何编程语言一样,有很多专业术语。)而且,“过滤器”不会像你想象的那样做,除非你使用的是一个你没有提到的特定库。
首先,按特定列拆分表可以用拆分来完成。下面给出了两个数据格式的列表,一个用于state == "state1",另一个用于state == "state2“。
by_state <- split(df,df$state)你在状态和类别之间循环--在类别上循环不会做任何事情。最后只需执行三次选择,在第二次和第三次使用相同的值覆盖by_state[sta]中的结果。
据我所知,您希望将y2001、y2002、y2003三列重新排列为单个列或向量,并删除类别列。我不太清楚您想要什么--您说的是“表”,但这是表()函数在R输出中的一种特定类型的对象,可能不是您想要的对象。根据你想要的输出,我猜“表”,你指的是向量。
现在,你想把几个向量“压缩”在一起,取c(1,1,1,.),c(2,2,2,.),c(3,3,3,.)(1,2,3,1,2,3,.)使用“rbind”执行此操作有一个有用的技巧。下面是如何在1,2和3的三个列表中使用它。
c(rbind(rep(1,5),rep(2,5),rep(3,5)))这取决于R存储数组的方式,即将所有元素放在一个列的一个向量中--首先,然后坚持一个属性,告诉R它实际上是一个p-by-q数组。“‘rbind”将向量连接到一个2乘n的数组中,然后'c’删除属性并将其转换为向量,现在按正确的顺序排列。
我们希望将此过程应用于副状态列表中的每个元素。如果您来自另一种编程语言,则可能会自动考虑使用循环。这在R中通常是低效的(因为它通常涉及大量冗余内存管理),因此养成使用函数式编程的习惯是个好主意。
我们希望对列表中的每个元素应用一个函数,返回一个结果列表。为此,我们需要“lapply”函数。
lapply(split(df,df$state), function(d){c(rbind(d$y2001,d$y2002,d$y2003))})返回两个向量。
但有可能你确实想要一些类似于数据的东西,这是一件很有用的事情。有一个以各种方式重新排列数据的库,这已经成为了它自己的编程范例。它被称为“潮间带”,因为它可以保持数据的整洁!
这并不是研究如何正确使用它的地方,但是您的特定示例可以这样做:
library(tidyr)
as.data.frame(pivot_longer(df,cols=c("y2001","y2002","y2003"),names_to="year",values_to="value"))它返回一个名为“tibble”的数据结构,这就像一个缩减的数据格式。(人们的想法是,不太可能去猜测你真正想要的东西,并做一些毫无帮助的事情。)如果您特别想要一个dataframe,仍然可以使用as.data.frame()函数进行转换。
发布于 2022-02-06 15:09:36
也许有更好的方法,因为我自己也是一个R初学者,但我会这样做:
df <- data.frame(
transport = c("bus1", "bus1", "bus2", "bus2", "bus2",
"bus2", "bus2", "bus2", "bus3", "bus4", "bus4", "bus4",
"bus4", "bus4", "bus4", "bus4", "bus4", "bus4"),
travel_time = c(2001, 2002, 2001, 2002, 2003,
2004, 2005, 2006, 2001, 2001,2002,2003,
2004,2005,2006,2007,2008,2009),
from = paste("stop",seq(1,18)),
to = paste("stop",seq(20,37))
)
library(tidyr)
df_bus <- df %>%
#unpivot from/to columns into variable and value columns
pivot_longer(cols = c(from, to)) %>%
#combine year information with from/to, so this information is not lost
transform(year_fromto=paste0(travel_time, "_", name)) %>%
#pivot the from/to columns per bus id
pivot_wider(id_cols= transport, names_from = year_fromto, values_from = value)
print(df_bus)样本输出:
# A tibble: 4 × 19
transport `2001_from` `2001_to` `2002_from` `2002_to` `2003_from` `2003_to`
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 bus1 stop 1 stop 20 stop 2 stop 21 <NA> <NA>
2 bus2 stop 3 stop 22 stop 4 stop 23 stop 5 stop 24
3 bus3 stop 9 stop 28 <NA> <NA> <NA> <NA>
4 bus4 stop 10 stop 29 stop 11 stop 30 stop 12 stop 31
# … with 12 more variables: `2004_from` <chr>, `2004_to` <chr>,
# `2005_from` <chr>, `2005_to` <chr>, `2006_from` <chr>, `2006_to` <chr>,
# `2007_from` <chr>, `2007_to` <chr>, `2008_from` <chr>, `2008_to` <chr>,
# `2009_from` <chr>, `2009_to` <chr>https://stackoverflow.com/questions/71001235
复制相似问题