R 如何通过从多个CSV文件中提取特定单元格来创建单个表

R 如何通过从多个CSV文件中提取特定单元格来创建单个表,r,R,我想知道是否有可能从工作目录的每个文件中创建一个新的数据框,其中包含某些单元格。例如,如果我有2个这样的数据帧,请忽略这些数字,因为它们是随机的: 假设在每个数据集中,第4行是我的值的总和,第5行是缺失值的数量。如果我将缺失值的数量表示为M,将冒号的和表示为N,那么我试图得到的是下表: 因此,每个文件“N”和“M”都在一行中 我在目录中有很多文件,所以我在一个列表中读取了它们,但不确定在一个文件列表中执行这样的任务的最佳方式是什么 这是我展示的表的示例代码,以及我如何在列表中读取它们: ##C

我想知道是否有可能从工作目录的每个文件中创建一个新的数据框,其中包含某些单元格。例如,如果我有2个这样的数据帧,请忽略这些数字,因为它们是随机的:

假设在每个数据集中,第4行是我的值的总和,第5行是缺失值的数量。如果我将缺失值的数量表示为M,将冒号的和表示为N,那么我试图得到的是下表:

因此,每个文件“N”和“M”都在一行中

我在目录中有很多文件,所以我在一个列表中读取了它们,但不确定在一个文件列表中执行这样的任务的最佳方式是什么

这是我展示的表的示例代码,以及我如何在列表中读取它们:

 ##Create sample data

df = data.frame(Type = 'wind', v1=c(1,2,3,100,50), v2=c(4,5,6,200,60), v3=c(6,7,8,300,70))
df2 =data.frame(Type = 'test', v1=c(3,2,1,400,40), v2=c(2,3,4,500,30), v3=c(6,7,8,600,20))

# write to directory
write.csv(df, file = "sample1.csv", row.names = F)
write.csv(df2, file = "sample2.csv", row.names = F)

# read to list
mycsv = dir(pattern=".csv")
n <- length(mycsv) 
 
mylist <- vector("list", n) 
for(i in 1:n) mylist[[i]] <- read.csv(mycsv[i],header = TRUE)
如果你能给我一些建议,关于这是否可能,以及我应该如何处理,我将非常感激

非常感谢,, 阿扬

这应该是可行的:

processFile <- function(File) {
    d <- read.csv(File, skip = 4, nrows = 2, header = FALSE, 
                  stringsAsFactors = FALSE)
    dd <- data.frame(d[1,1], t(unlist(d[-1])))
    names(dd) <- c("ID", "v1N", "V1M", "v2N", "V2M", "v3N", "V3M") 
    return(dd)
}

ll <- lapply(mycsv, processFile)
do.call(rbind, ll)
#     ID v1N V1M v2N V2M v3N V3M
# 1 wind 100  50 200  60 300  70
# 2 test 400  40 500  30 600  20

警告:我不确定我是否完全理解你想要什么。我认为您正在阅读一个列表,并希望从该列表中选择具有相同行的特定数据帧。然后,您需要创建这些行的数据帧,并从长格式转换为宽格式

LIST <- lapply(2:3, function(i) {
        x <- mylist[[i]][4:5, ]
        x <- data.frame(x, row = factor(rownames(x)))
        return(x)
    }
)

DF <- do.call("rbind", LIST)  #lets you bind an unknown number of rows from a list
levels(DF$row) <- list(M =4, N = 5) #recodes rows 4 and 5 with M and N

wide <- reshape(DF, v.names=c("v1", "v2", "v3"), idvar=c("Type"),
    timevar="row", direction="wide") #reshape from long to wide

rownames(wide) <- 1:nrow(wide) #give proper row names
wide

看起来可以用lappy替换for循环。但让我问一下:您的源文件很大吗?如果是,请查看read.table,它可以让您只加载所需的行,而不是整个文件。我不认为我完全理解海报需要什么。这看起来比我的回答更合适。谢谢你的回复,这正是我想要的!感谢tunlistd[-1]代码的清晰解释,理解如何处理真实数据集非常有用,再次感谢:很高兴额外的解释有所帮助。我意识到我在这一行中包含了很多想法,并希望在其中扩展一点可能会有所帮助。嗨,谢谢你的回答和帮助我。另一个答案实际上更符合我的数据集,但再次感谢您的回复:
LIST <- lapply(2:3, function(i) {
        x <- mylist[[i]][4:5, ]
        x <- data.frame(x, row = factor(rownames(x)))
        return(x)
    }
)

DF <- do.call("rbind", LIST)  #lets you bind an unknown number of rows from a list
levels(DF$row) <- list(M =4, N = 5) #recodes rows 4 and 5 with M and N

wide <- reshape(DF, v.names=c("v1", "v2", "v3"), idvar=c("Type"),
    timevar="row", direction="wide") #reshape from long to wide

rownames(wide) <- 1:nrow(wide) #give proper row names
wide
  Type v1.M v2.M v3.M v1.N v2.N v3.N
1 wind  100  200  300   50   60   70
2 test  400  500  600   40   30   20