首页 > 解决方案 > 如何根据 csv 文件中的前 6 个单元格创建列?

问题描述

在此处输入图像描述

所以我需要做的是使用前 9 行中所述的值创建列...例如,单元格 A1 的值应该是 E9,B1 的值应该是 E10、E11、E12、E13, ...

标签: rcsv

解决方案


假 CSV 数据,存储为"foo.csv"

REG,CO
UF,DF
ESTACAO,BRASILIA
Date,Hora,PRECIP,TEMP
01/01/2020,0000 UTC,0,20
01/01/2000,0100 UTC,0,19.5
01/01/2000,0200 UTC,0,21

阅读它,找到“真正的”标题行,然后继续:

alldat <- readLines("foo.csv")
alldat
# [1] "REG,CO"                     "UF,DF"                      "ESTACAO,BRASILIA"           "Date,Hora,PRECIP,TEMP"     
# [5] "01/01/2020,0000 UTC,0,20"   "01/01/2000,0100 UTC,0,19.5" "01/01/2000,0200 UTC,0,21"  
ind <- grep("Hora", alldat)
ind
# [1] 4

从这里,我们可以确定标头信息和其余数据:

header <- as.data.frame(t(read.csv(text = alldat[1:(ind-1)], header = FALSE, row.names = 1L)))
header
#    REG UF  ESTACAO
# V2  CO DF BRASILIA
rest_of_data <- read.csv(text = alldat[ind:(length(alldat))])
rest_of_data
#         Date     Hora PRECIP TEMP
# 1 01/01/2020 0000 UTC      0 20.0
# 2 01/01/2000 0100 UTC      0 19.5
# 3 01/01/2000 0200 UTC      0 21.0

然后我们可以cbind

rownames(header) <- NULL
cbind(rest_of_data, header)
#         Date     Hora PRECIP TEMP REG UF  ESTACAO
# 1 01/01/2020 0000 UTC      0 20.0  CO DF BRASILIA
# 2 01/01/2000 0100 UTC      0 19.5  CO DF BRASILIA
# 3 01/01/2000 0200 UTC      0 21.0  CO DF BRASILIA

(清除行名纯粹是为了在cbinding 时抢占警告,并非严格要求。)


推荐阅读