R 将数据帧转换为整洁格式

R 将数据帧转换为整洁格式,r,R,在这里,我尝试将dataframe转换为TIBLE格式,并将年、月列值拆分为它们自己的行: library(dpylr) library(tidyr) res <- data.frame("year.month" = c("2005M1","2005M2","2005M3","2005M4"), "national houses" = c(100,100,100,100), "dublin houses" = c(120,120,120,120)) res %>% separat

在这里,我尝试将dataframe转换为TIBLE格式,并将年、月列值拆分为它们自己的行:

library(dpylr)
library(tidyr)

res <- data.frame("year.month" = c("2005M1","2005M2","2005M3","2005M4"), "national houses" = c(100,100,100,100), "dublin houses" = c(120,120,120,120))

res %>% separate(year.month , into=c("year" , "month") ,  sep=".")

年份和月份值没有出现,我没有正确使用分隔符?

是正则表达式中的通配符,而
sep
中的
sep
参数使用正则表达式,因此您的代码尝试按每个字符分割
year.month
,因此警告值过多。以下内容使用正向向后看和向前看正确分隔列:

library(dplyr)
library(tidyr)

res %>% 
  separate(year.month, into = c("year", "month"), sep = "(?<=\\d)(?=M)")
结果:

  year month national.houses dublin.houses
1 2005    M1             100           120
2 2005    M2             100           120
3 2005    M3             100           120
4 2005    M4             100           120

我想,把年复一年的工作和月份分开,你就会有一半的整洁。 您仍然有两个单独的列,都计算房屋。每个观察值一行,每个变量一列需要如下内容:

res %>% 
  tidyr::gather(key = where, 
                value = houses, 
                -year.month) %>% 
  mutate(where = gsub(where, 
                      pattern = '\\.houses', 
                      replacement = '')) %>% 
  separate(year.month, 
           into = c('year', 'month'), 
           sep = 'M')

您能否详细说明为什么在gather中使用-year.month参数而不是year.month参数?为什么要对year.month使用负数运算符?列名称或名称集前面的-表示“但不要收集这些”。试着看看如果删除-year.month会发生什么。我不完全同意你的说法:“将年与月分开会使你保持半整洁”。什么是“整洁”取决于上下文(也就是说,没有适用于所有用例的单一表格格式)。而长格式(每个观察一行)对于某些操作(如绘图和聚合)可能更干净,宽格式可能更适用于表示每月计数。你的答案被接受,在OP的问题中没有足够的信息表明哪种格式更合适,IMO。我只是使用了严格的定义“每个观察值一行,每个变量一列。”根据这个定义,更长的是更整洁的;整洁的,取决于上下文,可能不会更有用。我想这就是你的意思,我同意。但我的建议被接受了。
  year month national.houses dublin.houses
1 2005    M1             100           120
2 2005    M2             100           120
3 2005    M3             100           120
4 2005    M4             100           120
res %>% 
  tidyr::gather(key = where, 
                value = houses, 
                -year.month) %>% 
  mutate(where = gsub(where, 
                      pattern = '\\.houses', 
                      replacement = '')) %>% 
  separate(year.month, 
           into = c('year', 'month'), 
           sep = 'M')