将列名称(年份)转换为变量值-Python,R
我有一个CSV,如下所示:将列名称(年份)转换为变量值-Python,R,python,r,pandas,Python,R,Pandas,我有一个CSV,如下所示: 1991 1992 1993 1991 1992 1993 VariableA VariableB VariableC VariableC VariableC VariableD VariableD VariableD lm mt 1 3 4 2
1991 1992 1993 1991 1992 1993
VariableA VariableB VariableC VariableC VariableC VariableD VariableD VariableD
lm mt 1 3 4 2 3 5
因此,我想创建一个名为year的变量,并执行以下操作:
VariableA VariableB Year VariableC VariableD
lm mt 1991 1 2
lm mt 1992 3 3
lm mt 1993 4 5
mydf <- read.csv("yourfile.csv", skip = 1, check.names = FALSE)
names(mydf)[-c(1, 2)] <- paste(names(mydf)[-c(1, 2)],
c(1991, 1992, 1993), sep = "_")
reshape(mydf, direction = "long", idvar = 1:2,
varying = 3:ncol(mydf), sep = "_")
# VariableA VariableB time VariableC VariableD
# lm.mt.1991 lm mt 1991 1 2
# lm.mt.1992 lm mt 1992 3 3
# lm.mt.1993 lm mt 1993 4 5
我主要是和我正在学习的熊猫一起工作,但我不知道如何正确地读取数据,然后再进行操作。如果有人提出了一个解决方案,在R,这将是很好的
版本:
我的真实数据框架是从1991年到2013年,有更多重复的变量。我使用建议的包splitstackshape
尝试了R中的代码,但收到了错误消息。那么,我的错误是什么
mydf <- read.csv("DatosCOMPUSTATfinal.csv", skip = 3, check.names = FALSE)
nombres <- names(mydf)[-c(1,2,3)]
nombres <- unique(nombres)
> nombres
[1] "Employees" "Market Value-daily"
[3] "Market to book - daily" "Total return"
[5] "Total assets" "total stockholders' equity"
[7] "Sales" "EBITDA"
[9] "EBIT" "Pretax income"
[11] "Income (loss)"
> names(mydf[c(1,2,3)])
[1] "Company name" "employer identification"
[3] "CUSIP"
names(mydf)[-c(1,2,3)] <- paste(names(mydf)[-c(1,2,3)],
c(1991:2013), sep = "_")
nv <- merged.stack(mydf, id.vars = names(mydf[c(1,2,3)]) , var.stubs = nombres , sep = "_" )
第二版:
我用重塑函数尝试了这段代码,但收到消息“内存耗尽”。我不知道为什么,因为数据帧只是在改变方向,它的大小小于15MB。为什么会发生这种情况,我该如何处理
newmydf <- reshape(mydf, direction = "long", idvar = 1:3, varying = 4:ncol(mydf), sep = "_")
Error: memory exhausted (limit reached?)
newmydf在R中,一种方法可能是读取csv,跳过第一行,将其作为变量名的一部分重新添加,然后使用重塑
获得所需的输出
请尝试以下操作:
VariableA VariableB Year VariableC VariableD
lm mt 1991 1 2
lm mt 1992 3 3
lm mt 1993 4 5
mydf <- read.csv("yourfile.csv", skip = 1, check.names = FALSE)
names(mydf)[-c(1, 2)] <- paste(names(mydf)[-c(1, 2)],
c(1991, 1992, 1993), sep = "_")
reshape(mydf, direction = "long", idvar = 1:2,
varying = 3:ncol(mydf), sep = "_")
# VariableA VariableB time VariableC VariableD
# lm.mt.1991 lm mt 1991 1 2
# lm.mt.1992 lm mt 1992 3 3
# lm.mt.1993 lm mt 1993 4 5
R
中的另一种方法是在使用@Ananda Mahto的帖子中提到的read.csv
读取数据集后,使用dplyr/tidyr
(这对于大型数据集来说会更快)
library(dplyr)
library(tidyr)
mydf %>%
gather(Var, Val, matches("[0-9]+$")) %>%
separate(Var, c("Var", "Year")) %>%
spread(Var, Val)
# VariableA VariableB Year VariableC VariableD
#1 lm mt 1991 1 2
#2 lm mt 1992 3 3
#3 lm mt 1993 4 5
数据
mydf您是否有一个用逗号分隔的csv
文件,或者数据与您发布的数据完全相同,只是用空格分隔?我有一个结构相同的csv。年份实际上是从1991年到2013年。所以,为了澄清,在“mydf”中有11*23(253)列?让我看看是否可以重新创建var.stubs中的错误.253加上id.vars中的错误3,总共256。我可能有偏见,但我更喜欢merged.stack
here:-)
mydf <- structure(list(VariableA = structure(1L, .Label = "lm", class = "factor"),
VariableB = structure(1L, .Label = "mt", class = "factor"),
VariableC_1991 = 1L, VariableC_1992 = 3L, VariableC_1993 = 4L,
VariableD_1991 = 2L, VariableD_1992 = 3L, VariableD_1993 = 5L), .Names = c("VariableA",
"VariableB", "VariableC_1991", "VariableC_1992", "VariableC_1993",
"VariableD_1991", "VariableD_1992", "VariableD_1993"), class = "data.frame", row.names = c(NA,
-1L))