1

我想在 R 中执行至少六个循环步骤。我的数据集是存储在一个文件夹中的28个文件。每个文件有 22 行(21 个个案,一行用于列名)和列如下:Id、id、PC1、PC2….PC20。

我打算:

  1. 将每个文件作为数据框读入 R
  2. 删除每个数据框中名为“Id”的第一列
  3. 安排每个数据帧如下:

    • 第一列应该是“id”和

    • 接下来的十列应该是前十个 PC(PC1、PC2、...PC10)

  4. 根据“id”对每个数据框进行排序(数据框应具有相同的个人顺序及其各自PC的分数)
  5. 在所有可能的配对组合(378 种组合)中,通过 vegan 包中的抗议函数执行配对比较
  6. 将每对比较的结果存储在对称 (28*28) 矩阵中,用于进一步分析

目前我可以为每对数据手动完成(代码如下):

## 1. step
  ## read files into R as a data frame
c_2d_hand_1a<-read.table("https://googledrive.com/host/0B90n5RdIvP6qbkNaUG1rTXN5OFE/PC scores, c_2d_hand-1a, Symmetric component.txt",header=T) 
c_2d_hand_1b<-read.table("https://googledrive.com/host/0B90n5RdIvP6qbkNaUG1rTXN5OFE/PC scores, c_2d_hand-1b, Symmetric component.txt",header=T) 

## 2. step
  ## delete first column named “Id” in the each data frame 
c_2d_hand_1a[,1]<-NULL
c_2d_hand_1b[,1]<-NULL

## 3. step
  ## arrange each data frame that have 21 rows and 11 columns (id,PC1,PC2..PC10)
c_2d_hand_1a<-c_2d_hand_1a[,1:11]
c_2d_hand_1b<-c_2d_hand_1b[,1:11]

## 4. step
  ## sort each data frame according to “id”
c_2d_hand_1a<-c_2d_hand_1a[order(c_2d_hand_1a$id),]
c_2d_hand_1b<-c_2d_hand_1b[order(c_2d_hand_1b$id),]

## 5. step
  ## perform pairwise comparison by protest function 
library(permute)
library(vegan)
c_2d_hand_1a_c_2d_hand_1b<-protest(c_2d_hand_1a[,2:ncol(c_2d_hand_1a)],c_2d_hand_1b[,2:ncol(c_2d_hand_1b)],permutations=10000) 
summary(c_2d_hand_1a_c_2d_hand_1b)[2] ## or c_2d_hand_1a_c_2d_hand_1b[3]

由于我是 R 中数据处理/操作的新手,我的自学技能适合手动执行相应的步骤,为每个数据集键入代码并在当时执行每个成对比较。由于我需要执行这六个步骤 378 次,因此手动输入会非常费时费力。

我尝试将文件作为列表导入并尝试了几次操作,但都不成功。具体来说,我使用 list.files() 创建了一个名为“probe”的列表。我能够使用例如探针[2] 选择某些数据帧。我还可以通过例如probe[2][1] 评估列“Id”,并通过probe[2][1]<-NULL 将其删除。但是当我尝试使用 for 循环时,我被卡住了。

4

1 回答 1

0

此代码未经测试,但如果运气好的话,它应该可以工作。抗议()结果的摘要存储在列表矩阵中。

# develop a way to easily reference all of the URLs
url.begin <- "https://googledrive.com/host/0B90n5RdIvP6qbkNaUG1rTXN5OFE/PC scores, "
url.middle <- c("c_2d_hand-1a", "c_2d_hand-1b")
url.end <- ", Symmetric component.txt"
L <- length(url.middle)

# read in all of the data and save it to a list of data frames
mybiglist <- lapply(url.middle, function(mid) read.table(paste0(url.begin, mid, url.end), header=TRUE))

# save columns 2 to 12 in each data frame and order by id
mybiglist11cols <- lapply(mybiglist, function(df) df[order(df$id), 2:12])

# get needed packages
library(permute)
library(vegan)

# create empty matrix of lists to store results
results <- matrix(vector("list", L*L), nrow=L, ncol=L)
# perform pairwise comparison by protest function 
for(i in 1:L) {
for(j in 1:L) {
    df1 <- mybiglist11cols[[i]]
    df2 <- mybiglist11cols[[j]]
    results[i, j] <- list(summary(protest(df1[, -1], df2[, -1], permutations=10000)))
    }}
于 2013-05-29T22:07:11.363 回答