如何在 R 中将多个 .txt 文件中的数据合并到一个数据帧中(需要转置)

How to combine data from multiple .txt files into one dataframe (transposing required) in R

提问人:Anne 提问时间:5/31/2021 更新时间:5/31/2021 访问量:65

问:

我正在努力导入/准备多个数据文件。 我研究中的每个参与者都有多个.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)

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

R 列表 数据帧 合并 TXT

评论

0赞 GuedesBF 5/31/2021
你试过吗?read.table(stringsAsFactors = FALSE)

答:

0赞 GuedesBF 5/31/2021 #1

也许如果您使用 导入数据并在第一个 lapply 调用中动态转置数据帧,而不是仅仅为了遍历数据而调用第二个循环?stringsAsFactors = FALSE)

像这样:

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) 

评论

0赞 Anne 6/1/2021
谢谢你的回答,但我无法让它起作用。我现在通过使用以下方法解决了它: filelist = list.files(pattern = “.*.txt”) datalist = lapply(filelist, FUN=read.table, sep=“;”,header=F) transposeList <- lapply(datalist,function(x){t(x)[-1,]}) datafr = do.call(“rbind”, transposeList) colnames(datafr)= ...datafr1 = as.data.frame(datafr, stringsAsFactors = F) 然后为每个变量指定正确的数据类型。