2

可能重复:
将带有两个标头的 csv 读入 data.frame

我是 R 新手,正在努力使用 R 分析一些数据。数据恰好是 Excel 格式,现在我正在努力寻找一种将其转换为 R 友好格式的方法。

问题是列标题已合并单元格,因此实际上标题有两行。我想将其转换为一组正常的一维向量,添加一个额外的列和一行。让我用一个例子来解释:

目前,excel 格式如下所示:

  |  H  |  J  | 
Y |M |F |M |F | 
== == == == == 
Y1|V1|V2|V3|V4|

H,J 是合并的列标题,它们中的每一个都跨越列 M 和 F。

= 表示上面的行是标题行

鉴于 H,J 都是 R 下的元素,我想将其转换为具有正常标题和两行的列格式,如下所示

Y |R |M |F |
== == == ==
Y1|H |V1|V2|
Y1|J |V3|V4|

有谁知道如何做到这一点?

4

1 回答 1

1

首先,一些假设:

  • 合并的标题位于 CSV 的第一行
  • 合并的标题从 CSV 的第二列开始
  • CSV 重复第二行中的变量名称(第一列中的变量除外)

第二,你的数据。

temp = c(",\"H\",,\"J\",", 
         "\"Y\",\"M\",\"F\",\"M\",\"F\"", 
         "\"Y1\",\"V1\",\"V2\",\"V3\",\"V4\"")

第三,这个答案的略微修改版本。

# check.names is set to FALSE to allow variable names to be repeated
ONE = read.csv(textConnection(temp), skip=1, check.names=FALSE,
               stringsAsFactors=FALSE)
GROUPS = read.csv(textConnection(temp), header=FALSE, 
                  nrows=1, stringsAsFactors=FALSE)
GROUPS = GROUPS[!is.na(GROUPS)]

# This can be shortened, but I've written it this way to show how
#   it can be generalized. For instance, if 3 columns were repeated
#   instead of 2, the rep statement could be changed to reflect that
names(ONE)[-1] = paste0(names(ONE)[-1], ".",
                        rep(GROUPS, each=(length(names(ONE)[-1])/2)))

第四,数据的实际重塑。

TWO = reshape(ONE, direction="long", ids=1, varying=2:ncol(ONE))
# And, here's the output.
TWO
#      Y time  M  F id
# 1.H Y1    H V1 V2  1
# 1.J Y1    J V3 V4  1
于 2012-08-26T18:05:28.803 回答