将多条csv行读入R中的单行

Posted

技术标签:

【中文标题】将多条csv行读入R中的单行【英文标题】:Reading multiple csv lines into single row in R 【发布时间】:2013-10-22 12:40:17 【问题描述】:

我有一个 csv 文件,每个唯一 id 有多行,我需要将其格式化为数据帧的单行。读完这个文件后,我得到了一个初始数据框:

id  week   v1  v2
01  week1  3   2
01  week2  5   2
01  week3  2   3
02  week1  1   2
02  week2  5   5
03  week1  4   1
03  week2  4   3
03  week3  4   2
[etc...]

我想提取给定 id 的所有 v1 实例,所以我获取所有唯一 id

uniqid<-unique(data$id)

然后从 1:length(uniqid) 开始遍历这些

temp <- subset(data,data$id==uniqid[i])

并将每周数据提取到临时变量中

week1 <- temp$v1[temp$week=="week1]

所以我可以使用 rbind 重构数据框

output <- rbind(output,data.frame(ID=uniqid[i],week1,week2,week3))

我的问题是,例如 id=02,没有 week3,所以 rbind 中断。似乎从未创建 week3 变量;它不显示为 NA。如何测试变量是否已创建并将其设置为 NA (或 0),以便 rbind 不会失败?还是有完全不同/更有效的方法来实现这一点?

【问题讨论】:

【参考方案1】:

在base R中,你可以使用reshape:

> reshape(mydf, direction = "wide", idvar="id", timevar="week")
  id v1.week1 v2.week1 v1.week2 v2.week2 v1.week3 v2.week3
1  1        3        2        5        2        2        3
4  2        1        2        5        5       NA       NA
6  3        4        1        4        3        4        2

如果要从输出中删除“v2”列,可以在重塑数据之前执行此操作,也可以从函数中删除它。

> reshape(mydf, direction = "wide", idvar="id", timevar="week", drop="v2")
  id v1.week1 v1.week2 v1.week3
1  1        3        5        2
4  2        1        5       NA
6  3        4        4        4

【讨论】:

【参考方案2】:

您可以使用 reshape2 包中的recast 函数。

DF
##   id  week v1 v2
## 1  1 week1  3  2
## 2  1 week2  5  2
## 3  1 week3  2  3
## 4  2 week1  1  2
## 5  2 week2  5  5
## 6  3 week1  4  1
## 7  3 week2  4  3
## 8  3 week3  4  2


require(reshape2)
temp <- recast(DF, id ~ week, measure.var = "v1")
result <- temp$data
row.names(result) <- temp$labels[[1]]$id
colnames(result) <- temp$labels[[2]]$week
result
##   week1 week2 week3
## 1     3     5     2
## 2     1     5    NA
## 3     4     4     4

或如@AnandaMahto 建议的那样,只需使用dcast

dcast(DF, id ~ week, value.var = "v1")
##   id week1 week2 week3
## 1  1     3     5     2
## 2  2     1     5    NA
## 3  3     4     4     4

【讨论】:

为什么是recast 而不是更常用的dcast @AnandaMahto 因为我先学会了recast ;).. 它不需要先melting 数据。 我还是没有按照你的逻辑。这个数据集已经很长了(不需要melt),使用dcast而不是recast将解决这个问题,而不会跳过重命名的麻烦:dcast(DF, id ~ week, value.var="v1")

以上是关于将多条csv行读入R中的单行的主要内容,如果未能解决你的问题,请参考以下文章

将文件夹中的多个csv文件读入R中的单个数据框[重复]

如何按行条件将巨大的 csv 文件读入 R?

试图读取存储在csv文件中的R中的推文

无法将 unicode .csv 读入 R

有效地将最后 'n' 行 CSV 读入 DataFrame

将特定行的csv读入php