如何重塑"这个数据变成了可用的格式?

时间:2018-01-27 17:06:56

标签: r reshape transpose

我有这个数据集,它以奇怪的方式格式化。

看起来像这样:

          1971 1971 1971 1972 1972 1972
          var1 var2 var3 var1 var2 var3
person1     37    2    1   65    5    3   
person2     65    2    1  123    3    1   
person3     23    3    1   13    6    2   

我想知道是否有任何简单的方法可以将这些数据转换成以下内容:

         year  var1 var2 var3
person1  1971    37    2    1   
person1  1972    65    5    3   
person2  1971    65    2    1 
person2  1972   123    3    1
person3  1971    23    3    1
person3  1972    13    6    2

我认为我要做的是反转重塑数据或其他东西。我已经研究过融化,演员和转置,但我无法获得任何可用的结果。

2 个答案:

答案 0 :(得分:0)

这是我试图找出你需要的东西。如果某些事情不准确,请将其修改为您的遗嘱。我使用了3个库,但不要担心。在R中,这些经常聚集在一起,无论如何都很好地了解未来。我本可以用基本的R编写代码,但这意味着更长的代码

<强> input.csv

,1971,1971,1971,1972,1972,1972
,var1,var2,var3,var1,var2,var3
person1,37,2,1,65,5,3
person2,65,2,1,123,3,1
person3,23,3,1,13,6,2

修改陈述的代码

library(reshape2)
library(tidyr)
library(dplyr)

input = read.table("input.csv", sep=",", na.strings="", header=T)[-1,]
converted_input = input %>%
  tidyr::gather(year, value, -X) %>%
  dplyr::mutate(
    var=paste0("var", as.numeric(gsub("^X.*", "0", gsub(".*\\.([0-9])$", "\\1", year)))+1),
    year=gsub("X([^.]+).*", "\\1", year)) %>%
  reshape2::dcast(X + year ~ var, value.var="value") %>%
  dplyr::rename(person=X)

print(converted_input)

最终结果

 person year var1 var2 var3
person1 1971   37    2    1
person1 1972   65    5    3
person2 1971   65    2    1
person2 1972  123    3    1
person3 1971   23    3    1
person3 1972   13    6    2

答案 1 :(得分:0)

这是一种难以使用的格式,因为原始文件中的列标题信息来自两行。我的方法是读取除第一行之外的所有数据,然后读取第一行以进行数据操作。

第1步:读取第一行以外的数据

UPDATE p
    SET PRHAverageRating = rp.avg_ReviewRateValue
    FROM ProductRankingHistory p JOIN
         (SELECT r.ProductID, YEAR(r.ReviewRateDate) as yyyy, AVG(r.ReviewRateValue) as avg_ReviewRateValue
          FROM Review r
          GROUP BY r.ProductID, YEAR(r.ReviewRateDate)
         ) rp
         ON rp.ProductId = p.PRHProduct AND rp.yyyy = p.prhYear;

第2步:将第一行作为向量读取

dat <- read.table(text = "         1971 1971 1971 1972 1972 1972
          var1 var2 var3 var1 var2 var3
                  person1     37    2    1   65    5    3   
                  person2     65    2    1  123    3    1   
                  person3     23    3    1   13    6    2",
                  header = TRUE, stringsAsFactors = FALSE, skip = 1)
dat
#         var1 var2 var3 var1.1 var2.1 var3.1
# person1   37    2    1     65      5      3
# person2   65    2    1    123      3      1
# person3   23    3    1     13      6      2

第3步:合并标题信息

Year <- read.table(text = "         1971 1971 1971 1972 1972 1972
          var1 var2 var3 var1 var2 var3
                   person1     37    2    1   65    5    3   
                   person2     65    2    1  123    3    1   
                   person3     23    3    1   13    6    2",
                   header = FALSE, stringsAsFactors = FALSE, nrows = 1)

# Convert Year to a vector
Year <- unlist(Year)
Year
#   V1   V2   V3   V4   V5   V6 
# 1971 1971 1971 1972 1972 1972

现在library(tidyverse) # Rename the dat dat data frame dat2 <- dat %>% setNames(paste(names(.), Year, sep = "_")) %>% setNames(sub("\\.\\d+", "", names(.))) dat2 # var1_1971 var2_1971 var3_1971 var1_1972 var2_1972 var3_1972 # person1 37 2 1 65 5 3 # person2 65 2 1 123 3 1 # person3 23 3 1 13 6 2 是我们可以使用的格式。

第4步:重塑数据框

dat2

# Reshape the dtaa frame dat3 <- dat2 %>% rownames_to_column(var = "Person") %>% gather(Variable, Value, -Person) %>% separate(Variable, into = c("Var", "Year")) %>% spread(Var, Value) dat3 # Person Year var1 var2 var3 # 1 person1 1971 37 2 1 # 2 person1 1972 65 5 3 # 3 person2 1971 65 2 1 # 4 person2 1972 123 3 1 # 5 person3 1971 23 3 1 # 6 person3 1972 13 6 2 是最终输出。