首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中转换超过3列的数据帧?

如何在R中转换超过3列的数据帧?
EN

Stack Overflow用户
提问于 2018-04-27 06:52:05
回答 1查看 107关注 0票数 0

从Access数据库导入时,我得到的数据如下所示:

代码语言:javascript
复制
p <- data.frame(SurvDate = as.Date(c('2018-11-1','2018-11-1','2018-11-1',
                                     '2018-11-3', '2018-11-3')), 
                Area = c('AF','BB','CT', 'DF', 'BB'), 
                pCount = c(6, 3, 0, 12, 32), 
                ObsTime = c('8:51','8:59','9:13', '9:24', '9:30'), 
                stringsAsFactors = FALSE)

我希望将数据转换为行为SurvDate,列为区域(值为pCount),每个区域旁边为ObsTime列,值为ObsTime。

示例:

代码语言:javascript
复制
n <- data.frame(SurvDate = as.Date(c('2018-11-1','2018-11-3')), 
                AF = c(6, NA), 
                TimeAF = c('8:51', NA), 
                BB = c(3, 32), 
                TimeBB = c('8:59', '9:30'), 
                CT = c(0, NA), 
                TimeCT = c(NA, '9:13'), 
                DF = c(NA,12), 
                TimeDF = c(NA, '9:24'))

我已经尝试了这个主题的变化,但没有时间工作。

代码语言:javascript
复制
library(reshape2)
dcast(p, SurvDate+ObsTime ~ Area)
EN

回答 1

Stack Overflow用户

发布于 2018-04-27 07:20:41

以下是使用tidyverse工具的一种方法。注意,输出与您的预期输出不同,因为您似乎没有将CT的值放在正确的位置(值分布在两个日期)。一种方法是对这些值进行unite,这样我们就有一个单独的键值对用于spread,然后使用mutate_at再次分隔这些列。我们也可以多次使用separate,尽管使用太多的Area会变得很笨拙。

代码语言:javascript
复制
SurvDate <- as.Date(c('2018-11-1','2018-11-1','2018-11-1', '2018-11-3', '2018-11-3'))
Area <- c('AF','BB','CT', 'DF', 'BB')
People <- c(6, 3, 0, 12, 32)
ObsTime <- (c('8:51','8:59','9:13', '9:24', '9:30'))
p <- data.frame(SurvDate, Area, People, ObsTime, stringsAsFactors = FALSE)

library(tidyverse)
p %>%
  unite(vals, People, ObsTime) %>%
  spread(Area, vals) %>%
  mutate_at(
    .vars = vars(-SurvDate),
    .funs = funs(
      Time = str_extract(., "(?<=_).*$"),
      Area = str_extract(., "^.*(?=_)")
    )
  ) %>%
  filter(!is.na(SurvDate)) %>%
  select(SurvDate,  matches("_")) %>%
  select(SurvDate, order(colnames(.)))
#>     SurvDate AF_Area AF_Time BB_Area BB_Time CT_Area CT_Time DF_Area
#> 1 2018-11-01       6    8:51       3    8:59       0    9:13    <NA>
#> 2 2018-11-03    <NA>    <NA>      32    9:30    <NA>    <NA>      12
#>   DF_Time
#> 1    <NA>
#> 2    9:24

reprex package创建于2018-04-30 (v0.2.0)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50052946

复制
相关文章

相似问题

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