将变量名称子集化为矩阵的循环

时间:2017-06-01 10:01:33

标签: r loops

我需要从我的数据框中获取变量名称,以确保它们的名称相同。起初它看起来很简单,我使用了两个dfs的测试代码:

x=rbind(colnames(df1), colnames(df2))

使用示例它看起来像这样:

VAR1 VAR2 VAR3
VAR1 VAR2 VARa

x被视为matrix,非常方便。

但由于dfs比两个更多,所以需要循环,所以我编写了简单的代码:

varnames=0
for (i in 1:length(mylist){
varnames=rbind(colnames(get(mylist[i])))
}

mylist是我的dfs名称列表。对象varnames是一个matrix,但它只有一行......你能提供quickfix吗?我相信我错过了一些简单的事情。

1 个答案:

答案 0 :(得分:1)

您可以使用do.call

cn1 <- c("aa", "bb", "cc")
cn2 <- c("ab", "bb", "cc")
cn3 <- c("ab", "bc", "cc")

cnames <- list(cn1, cn2, cn3)

do.call(rbind, cnames)

#     [,1] [,2] [,3]
#[1,] "aa" "bb" "cc"
#[2,] "ab" "bb" "cc"
#[3,] "ab" "bc" "cc"

或者在数据框列表中使用sapply

df1 <- data.frame(aa=runif(9), bb=runif(9), cc=runif(9))
df2 <- data.frame(ab=runif(9), bb=runif(9), cc=runif(9))
df3 <- data.frame(ab=runif(9), bc=runif(9), cc=runif(9))

dataframes <- list(df1, df2, df3)

sapply(dataframes, colnames)

#     [,1] [,2] [,3]
#[1,] "aa" "ab" "ab"
#[2,] "bb" "bb" "bc"
#[3,] "cc" "cc" "cc"

要从尚未加载的csv文件执行此操作

首先创建示例文件

library(Hmisc)

df1 <- data.frame(aa=runif(9), bb=runif(9), cc=runif(9))
df2 <- data.frame(ab=runif(9), bb=runif(9), cc=runif(9))
df3 <- data.frame(ab=runif(9), bc=runif(9), cc=runif(9))

# create named list of data frames
dataframes <- llist(df1, df2, df3)

dir <- "dftest"
dir.create(dir)

# write data frames in list to individual csv files int specified directory
lapply(names(dataframes), function(x) {
    write.csv(dataframes[[x]], file=file.path(dir, paste0(x, ".csv")), 
    row.names=FALSE)
    })

读取csv文件并获取列名

# get the path of the csv files
filenames <- file.path(dir, list.files(dir, pattern="*.\\.csv$"))

# read csv files into a list and assign names
csv.list <- lapply(filenames, read.csv)
names(csv.list) <- sub("\\.csv$", "", basename(filenames))

# same as before
sapply(dataframes, colnames)