【问题标题】:How to combine data from multiple .txt files into one dataframe (transposing required) in R如何在 R 中将来自多个 .txt 文件的数据组合成一个数据帧(需要转置)
【发布时间】:2021-08-18 19:46:35
【问题描述】:

我正在为多个数据文件的导入/准备而苦苦挣扎。 我研究中的每个参与者都有多个 .txt 格式的数据文件。我想创建一个包含所有参与者数据的主数据文件。

我想出了如何使用以下代码对我的数据子集执行此操作:

setwd("...")

data1 = read.delim("Data-2021-5-11-16-17-49.txt", header = F, sep=";")
data2 = read.delim("Data-2021-5-11-16-18-6.txt", header = F, sep=";")
data3 = read.delim("Data-2021-5-11-16-18-19.txt", header = F, sep=";")

data1 = as.data.frame(t(data1))
colnames(data1) = c("finalBarAngle", "finalBarAngleRelativeToCamera", "HeadTilt", "HeadTranslation", "BarNDisks", "BarImageRatio", "DiskBarRatio", "BarDepth", "BarColor", "BarTopColor", "BarAngle", "BarRight", "BarLeft", "BarReady", "BarStepAngle", "KeyRepeatedDelay", "BarStepAngle", "ImageFile", "ImageSize", "ImageSizeDepthRatio", "ImageAngle", "ImageSpeed", "ChromaKey", "BackgroundColor")
data1 = data1[-1,]

data2 = as.data.frame(t(data2))
colnames(data2) = colnames(data1)
data2 = data2[-1,]

data3 = as.data.frame(t(data3))
colnames(data3) = colnames(data1)
data3 = data3[-1,]

data = rbind(data1,data2,data3)

这对我有用并生成我想要的主数据文件。但是,由于每个参与者都有 80 个这样的数据文件,因此采用这种方法会非常麻烦。因此,我正在寻找一段可以自动执行此操作的代码?

我尝试使用 list.files 和 lapply,但没有得到我想要的结果。问题是列表的内容成为一个因素,我首先需要转置列表中的数据框:

mypath = "..."
txt_files_ls = list.files(path=mypath, pattern="*.txt") 
txt_files_df <- lapply(txt_files_ls, function(x) {read.table(file = x, header = F, sep =";")})
transposeList <- lapply(txt_files_df,function(x){t(x)[-1,]})
combined_df <- do.call("rbind", lapply(transposeList, as.data.frame)) 

用于重现问题的 .txt 文件之一的示例数据(所有输入文件都遵循此结构):

finalBarAngle;10
finalBarAngleRelativeToCamera;15
HeadTilt;True
HeadTranslation;True
BarImageRatio;8
DiskBarRatio;0.8
DiskBarRatio;0.25
BarDepth;2
BarColor;RGBA(0.000, 1.000, 0.000, 1.000)
BarTopColor;RGBA(1.000, 0.000, 1.000, 1.000)
BarAngle;23
BarRight;Keypad6
BarLeft;Keypad0
BarReady;Keypad5
BarStepAngle;0.5
BarStepAngle;750
BarStepAngle;0.1
KeyRepeatDelay;Frame.png
BarRepeatedStep;500
ImageFile;0.6666667
ImageDepth;-28
ImageSizeDepthRatio;0
ImageAngle;RGBA(0.000, 0.000, 0.000, 1.000)
ImageSpeed;RGBA(0.000, 0.000, 0.000, 1.000)

请注意,我的原始文件中的变量名称不正确(有一些重复,因此缺少一些其他名称)。

【问题讨论】:

  • 你试过read.table(stringsAsFactors = FALSE)吗?

标签: r list dataframe merge txt


【解决方案1】:

也许如果您使用stringsAsFactors = FALSE) 导入数据,并在第一次 lapply 调用中即时转置数据帧,而不是调用第二个循环来转置数据?

类似:

mypath = "..."
txt_files_ls = list.files(path=mypath, pattern="*.txt") 
txt_files_df <- lapply(txt_files_ls, function(x) {
     output<-read.table(file = x, header = F, sep =";", stringsAsFactors = F)
     output<-t(output)[-1]})

combined_df <- do.call(rbind, output) 

【讨论】:

  • 感谢您的回答,但我无法让它工作。我现在使用以下方法解决了它: filelist = list.files(pattern = ".*.txt") datalist = lapply(filelist, FUN=read.table, sep=";",header=F) transposeList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2020-12-18
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多