【问题标题】:How do I group a data frame by multiple columns?如何按多列对数据框进行分组?
【发布时间】:2021-09-26 14:29:27
【问题描述】:

我有一个非常复杂的数据框,当组织成一个数据框时看起来像这样:

HEADER
<chr>
13:30:00.587: <- $GPGGA,183000.30,4415.6243,N,08823.9769,W,1,7,1.7,225.5,M,-33.4,M,,*68 
13:30:00.683: <- $GPGLL,4415.6243,N,08823.9769,W,183000.40,A,A*72   
13:30:00.779: <- $GPVTG,159.6,T,163.2,M,0.1,N,0.1,K,A*2E    
13:30:00.827: <- $HCHDG,74.8,0.0,E,3.6,W*6E 
13:30:01.003: <- $WIMDA,29.9641,I,1.0147,B,26.5,C,,,48.2,,14.6,C,323.0,T,326.6,M,1.4,N,0.7,M*66 
13:30:01.051: <- $WIMWV,248.4,R,1.1,N,A*29  
13:30:01.114: <- $WIMWV,255.6,T,1.3,N,A*23  
13:30:01.195: <- $YXXDR,A,-53.9,D,PTCH,A,-34.2,D,ROLL*57    
13:30:01.307: <- $YXXDR,A,0.571,G,XACC,A,0.783,G,YACC,A,-0.181,G,ZACC*57    
13:30:01.578: <- $GPGGA,183001.30,4415.6242,N,08823.9769,W,1,7,1.7,225.9,M,-33.4,M,,*64

我需要对它进行组织,以便我能够按照开头的 5 个字母字符串进行分组,例如 GPGGA,我已经使用此代码设法做到了:

df <- data.frame(Weather_data)
df_GPGGA <- df %>%
  mutate("Entry" = gsub(".*\\$([A-Z]+),.*", "\\1", HEADER)) %>%
  group_by("Entry") %>%
  filter(Entry == "GPGGA")

因为这会输出一个 2 列 df,其中所有数据都在一个长字符串中,就像上面一样,作为列“HEADER”,现在是一个不错的标题,以及按确切的 5- 分组的第二列“Entry”特定行中的字母字符串(参见下面的屏幕截图)。

我的最终目标是能够为每个单独的数据集制作一个 .csv(由 5 个字母字符串分隔,因此我使用了过滤器;我为每个不同的 5 个字母字符串重复了此代码。输出对于每一行 GPGGA 代码,我正在使用的仪器与 GPGLL 行的输出信息并不完全相同),每个逗号分隔的值都在其指定的列中。但我不知道如何从那里格式化每个文档。这是一次尝试的屏幕截图:.csv without data separated。如何将所有这些数据放入单独的列中?

这是请求的可重现数据集:

dput(Weather_data) 输出this image

【问题讨论】:

  • 您好!请通过在您的帖子中粘贴dput(Weather_data) 的输出来提供可重现的数据集。谢谢!
  • 顺便说一句:在group_by(.) 之后缺少%&gt;%,你的filter 应该有== 而不是=
  • 我添加了 dput(Weather_data) 输出并更正了我的代码错误;我错过了他们将文本复制过来,它们在我的原始代码中。
  • 使用dpit(x) 的全部意义在于我们可以复制文本以获得明确的数据样本。它的图像不是很有用。话虽如此,它与我在答案中包含的疑问输出有什么不同吗?我的回答有帮助吗?

标签: r dataframe csv


【解决方案1】:

这是一个开始:

library(dplyr)
stuff <- strcapture("^([0-9.:]*): <-\\s*(\\$[^,]+),(.*)", dat$HEADER,
           list(time = "", group = "", string = "")) %>%
  transmute(group, string = paste0(time, ",", string)) %>%
  group_by(group) %>%
  summarize(data = lapply(paste(string, collapse = "\n"),
                          function(z) read.csv(text = z, header = FALSE)))
stuff
# # A tibble: 7 x 2
#   group  data              
#   <chr>  <list>            
# 1 $GPGGA <df[,15] [2 x 15]>
# 2 $GPGLL <df[,8] [1 x 8]>  
# 3 $GPVTG <df[,10] [1 x 10]>
# 4 $HCHDG <df[,6] [1 x 6]>  
# 5 $WIMDA <df[,21] [1 x 21]>
# 6 $WIMWV <df[,6] [2 x 6]>  
# 7 $YXXDR <df[,13] [2 x 13]>
stuff$data[[1]]
#             V1       V2       V3 V4       V5 V6 V7 V8  V9   V10 V11   V12 V13 V14  V15
# 1 13:30:00.587 183000.3 4415.624  N 8823.977  W  1  7 1.7 225.5   M -33.4   M  NA *68 
# 2 13:30:01.578 183001.3 4415.624  N 8823.977  W  1  7 1.7 225.9   M -33.4   M  NA  *64

数据:

dat <- structure(list(HEADER = c("13:30:00.587: <- $GPGGA,183000.30,4415.6243,N,08823.9769,W,1,7,1.7,225.5,M,-33.4,M,,*68 ", "13:30:00.683: <- $GPGLL,4415.6243,N,08823.9769,W,183000.40,A,A*72   ", "13:30:00.779: <- $GPVTG,159.6,T,163.2,M,0.1,N,0.1,K,A*2E    ", "13:30:00.827: <- $HCHDG,74.8,0.0,E,3.6,W*6E ", "13:30:01.003: <- $WIMDA,29.9641,I,1.0147,B,26.5,C,,,48.2,,14.6,C,323.0,T,326.6,M,1.4,N,0.7,M*66 ", "13:30:01.051: <- $WIMWV,248.4,R,1.1,N,A*29  ", "13:30:01.114: <- $WIMWV,255.6,T,1.3,N,A*23  ", "13:30:01.195: <- $YXXDR,A,-53.9,D,PTCH,A,-34.2,D,ROLL*57    ", "13:30:01.307: <- $YXXDR,A,0.571,G,XACC,A,0.783,G,YACC,A,-0.181,G,ZACC*57    ", "13:30:01.578: <- $GPGGA,183001.30,4415.6242,N,08823.9769,W,1,7,1.7,225.9,M,-33.4,M,,*64")), class = "data.frame", row.names = c(NA, -10L))

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2022-01-22
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2015-05-15
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多