将2D数据框中存储的观测数据转换为R中的3D数组

时间:2018-09-15 20:01:16

标签: arrays r dataframe multidimensional-array

我正在尝试从R中的2D数据帧生成3D数组,并且确实可以使用一些帮助。到目前为止,我还没有从以前发布的类似问题中找到解决此问题的方法。

我的输入数据可在此处找到:https://www.dropbox.com/s/7f8td34mpzgpvgh/example_data.csv?dl=0,它们类似于以下基本结构:我有14个站点(即function fix(v, left, right) { return (v < 0 ? '-' : '+') + Math.abs(v).toFixed(right).padStart(left + right + 1, '0'); } console.log(fix(32.91, 3, 4)); // +032.9100 console.log(fix(-2.1, 3, 4)); // -002.1000 console.log(fix(0.32546, 3, 4)); // +000.3255),每个站点有6个重复项(即Field),其中调查中存在32个主题的子集(即种类代码:ReplicateAMGO等)。

输入数据的子集如下:

BASW

我想将这些输入数据重新格式化为类似于3D数组(即14个站点x 6个重复x 32个主题),如下面的example_data[1:5, 1:5] Field Replicate AMGO BASW BHCO 1 Brinkman 1 2 0 0 72 Brinkman 2 10 0 0 190 Brinkman 3 6 0 0 283 Brinkman 4 0 0 0 342 Brinkman 5 2 1 0 物种所示:

AMGO

请注意,在解决方案中,当在调查期间实际遇到, , = AMGO 1 2 3 4 5 6 Brinkman 0 0 0 0 0 0 Clara 0 0 0 0 0 0 Esckelson 0 0 0 0 0 0 GarnerEast 0 0 0 0 0 0 GarnerWest 0 0 0 0 0 0 KHess 0 0 0 0 0 0 Lounsbury 0 0 0 0 0 0 McCallum 0 0 0 0 0 0 Pomeroy 0 0 0 0 0 0 Sattelberg 0 0 0 0 0 0 THess 0 0 0 0 0 0 Turner 0 0 0 0 0 0 VollmarEast 0 0 0 0 0 0 VollmarWest 0 0 0 0 0 0 ... (和其他物种)时,上面的许多零可能会被非零计数取代。

请让我知道是否需要澄清,并在此先感谢!

1 个答案:

答案 0 :(得分:1)

这是一个使用基数R中的reshape()函数的解决方案。我正在将该函数应用于每个主题列,并创建了一个经过整形的数据帧列表。

df <- read.csv("C:\\Users\\Shrivatav\\Downloads\\example_data.csv", encoding = "UTF-8")

# Extract subject columns 
list.of.cols <- colnames(df)[3:34]

# Function for reshaping
func.for.reshaping <- function(column){

  # Subset the data, keep only Field, replicate and the column input in the 
  # function
  to.keep <- c("Field", "Replicate", column)
  subset.df <- df[to.keep]
  # reshape from long to wide
  reshaped.df <- reshape(subset.df, idvar = "Field", timevar = "Replicate", direction = "wide")
  return(reshaped.df)
}

# Apply the function over all subject columns, reulting
# in a list of dataframes
list.of.reshaped.dfs <- lapply(list.of.cols, func.for.reshaping)

# Name the list for easy access
names(list.of.reshaped.dfs) <- list.of.cols

您可以访问列表的元素,例如:list.of.reshaped.dfs$AMGO等。