我有这个数据集,它以奇怪的方式格式化。
看起来像这样:
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
我认为我要做的是反转重塑数据或其他东西。我已经研究过融化,演员和转置,但我无法获得任何可用的结果。
答案 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
是最终输出。