-2

我想在 R 中导入多个数据并找到每个文件第三列的平均值。我在下面展示了示例。

我已经使用 Ramnath 的Import multiple text files in R 中的解决方案在 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 列表更改为数据框

  # 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

正如您在最终文件中看到的那样,前两列是相同的,唯一不同的是第三列是来自两个文件的两个值的平均值。所以,我想用我的数据改成类似于上图的最终文件的数据框。

4

1 回答 1

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

只有一列?

由于您仅从读取输入文件中获得一列,因此根据您的输出,您应该使用or来dim调查该数据框,看看出了什么问题。很可能,您的列不是由制表符分隔,而是由逗号或空格等分隔。请注意,如果您指定,则任何空格和/或制表符序列都将用作列分隔符。有关详细信息,请阅读文档。headstrsepread.table

于 2013-02-04T06:36:42.377 回答