首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:如何循环遍历多个列,并将每个类别的值存储在向量中

R:如何循环遍历多个列,并将每个类别的值存储在向量中
EN

Stack Overflow用户
提问于 2022-02-05 19:03:05
回答 2查看 476关注 0票数 0

我对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站。

由于这些公共汽车没有相同的行程,转换后的表/列表没有相同的列数。

我不知道重塑数据集的最佳方法是什么。我应该使用循环吗?

非常感谢

举下面的例子:

代码语言:javascript
复制
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))
)
EN

回答 2

Stack Overflow用户

发布于 2022-02-05 21:43:55

现在还不清楚你想要什么形式,你想要的输出是什么-所以这可能不会给你确切的你想要的。(这在刚接触R的人中很常见,就像任何编程语言一样,有很多专业术语。)而且,“过滤器”不会像你想象的那样做,除非你使用的是一个你没有提到的特定库。

首先,按特定列拆分表可以用拆分来完成。下面给出了两个数据格式的列表,一个用于state == "state1",另一个用于state == "state2“。

代码语言:javascript
复制
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的三个列表中使用它。

代码语言:javascript
复制
c(rbind(rep(1,5),rep(2,5),rep(3,5)))

这取决于R存储数组的方式,即将所有元素放在一个列的一个向量中--首先,然后坚持一个属性,告诉R它实际上是一个p-by-q数组。“‘rbind”将向量连接到一个2乘n的数组中,然后'c’删除属性并将其转换为向量,现在按正确的顺序排列。

我们希望将此过程应用于副状态列表中的每个元素。如果您来自另一种编程语言,则可能会自动考虑使用循环。这在R中通常是低效的(因为它通常涉及大量冗余内存管理),因此养成使用函数式编程的习惯是个好主意。

我们希望对列表中的每个元素应用一个函数,返回一个结果列表。为此,我们需要“lapply”函数。

代码语言:javascript
复制
lapply(split(df,df$state), function(d){c(rbind(d$y2001,d$y2002,d$y2003))})

返回两个向量。

但有可能你确实想要一些类似于数据的东西,这是一件很有用的事情。有一个以各种方式重新排列数据的库,这已经成为了它自己的编程范例。它被称为“潮间带”,因为它可以保持数据的整洁!

这并不是研究如何正确使用它的地方,但是您的特定示例可以这样做:

代码语言:javascript
复制
library(tidyr)
as.data.frame(pivot_longer(df,cols=c("y2001","y2002","y2003"),names_to="year",values_to="value"))

它返回一个名为“tibble”的数据结构,这就像一个缩减的数据格式。(人们的想法是,不太可能去猜测你真正想要的东西,并做一些毫无帮助的事情。)如果您特别想要一个dataframe,仍然可以使用as.data.frame()函数进行转换。

票数 0
EN

Stack Overflow用户

发布于 2022-02-06 15:09:36

也许有更好的方法,因为我自己也是一个R初学者,但我会这样做:

代码语言:javascript
复制
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)

样本输出:

代码语言:javascript
复制
# 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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71001235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档