我想在R中导入多个数据,并找到每个文件的第三列的平均值。我在下面展示了一些例子。
我使用来自Import multiple text files in R and assign them names from a predetermined list的Ramnath解决方案在R中导入了多个文件。 我到目前为止使用的代码如下:
#Import mulitple text using following code: files with extension *.dat
txt_files =list.files(pattern='\\.dat$')
data_list=lapply(txt_files,read.table,sep="\t",header=T)
使用Nico的答案来更改R list to data frame
中的数据框 # Change the list to dataframe
hello <- as.data.frame(do.call(rbind,data_list))
dim(hello)
# Using 12 files I got the following information
> dim(hello)
[1] 58536 1
每个文件的行数为4878。这不是我想要的。上面的代码所做的是将所有数据合并到一个基于行的数据帧中。
我希望它按列,并能够计算每个文件的第三列的平均值。我想使用每个文件的第三列并找到平均数组。
我想要的样本如下:
档案1
Lat Long Value
10 12 15
12 13 16
文件2
Lat Long Value
10 12 11
12 13 15
最终档案
Lat Long Value
10 12 13
12 13 15.5
正如您在最终文件中看到的那样,前两列是相同的,只有不同的是第三列,它是两个文件中两个值的平均值。所以,我想使用我的数据更改为类似于最终文件的数据框,如上所示。
答案 0 :(得分:2)
按行组合事物是正确的,只要您不要求最终列表按任何特定顺序排列,并且没有具有相同坐标的不同行。在这种情况下,您可以简单地使用公共坐标对行进行分组,然后像这样聚合它们:
aggregate(Value ~ Lat + Lon, hello, mean)
另一方面,如果您有重复的坐标,或者希望最终结果与所有输入的顺序相同,那么您应该从每个Value
中提取data.frame
列,将它们组合成一个矩阵。然后,您可以计算每个矩阵行的平均值,并将这些平均值与任何输入数据框的两个坐标列组合在一起。整个方法在很大程度上依赖于输入数据行的顺序,即在给定位置的行号在所有文件中是相同的。你可以像这样实现它:
mean_values <- apply(do.call(cbind, lapply(data_list, function(df) df$Value)), 1, mean)
cbind(data_list[[1]][1:2], Value=mean_values)
以下是我的系统中的示例会话:
> data_list <- list(File.1=data.frame(Lat=c(10,12),Lon=c(12,13),Value=c(15,16)),
File.2=data.frame(Lat=c(10,12),Lon=c(12,13),Value=c(11,15)))
> hello <- as.data.frame(do.call(rbind,data_list))
> dim(hello)
[1] 4 3
> str(hello)
'data.frame': 4 obs. of 3 variables:
$ Lat : num 10 12 10 12
$ Lon : num 12 13 12 13
$ Value: num 15 16 11 15
> aggregate(Value ~ Lat + Lon, hello, mean)
Lat Lon Value
1 10 12 13.0
2 12 13 15.5
> value_matrix <- do.call(cbind, lapply(data_list, function(df) df$Value))
> value_matrix
File.1 File.2
[1,] 15 11
[2,] 16 15
> mean_values <- apply(value_matrix, 1, mean)
> cbind(data_list[[1]][1:2], Value=mean_values)
Lat Lon Value
1 10 12 13.0
2 12 13 15.5
由于您只需阅读输入文件中的一列,根据您的dim
输出,您应该使用head
或str
调查该数据框,以查看出现了什么问题。最有可能的是,您的列不是由制表符分隔,而是用逗号或空格或其他类型分隔。请注意,如果您执行 not spcify sep
,则任何序列的空格和/或制表符都将用作列分隔符。有关详细信息,请阅读read.table
的文档。