R中的colnames()函数 - 将表值作为独立对象/变量处理

问题描述:

我有一个值列表,我希望将它用作从某个网站上的单独网址抓取的单独表的名称。R中的colnames()函数 - 将表值作为独立对象/变量处理

> Fac_table 
[[1]] 
[1] "fulltime_fac_table" 

[[2]] 
[1] "parttime_fac_table" 

[[3]] 
[1] "honorary_fac_table" 

[[4]] 
[1] "retired_fac_table" 

我想通过列表循环来自动生成具有相应名称的4个表。

结果应该是这样的:

> fulltime_fac_table 
    職稱   
V1 "教授兼系主任" 
V2 "教授"   
V3 "教授"   
V4 "教授"   
V5 "特聘教授"  

> parttime_fac_table 
    職稱  姓名  
V1 "教授"  "XXX" 
V2 "教授"  "XXX" 
V3 "教授"  "XXX" 
V4 "教授"  "XXX" 
V5 "教授"  "XXX" 
V6 "教授"  "XXX" 

我还有一个列表,命名为“头”,包含各表的列标题在线。

> headers 
[[1]] 
[1] "職稱"    "姓名"    "    研究領域" 
[4] "聯絡方式"   

[[2]] 
[1] "職稱"  "姓名"  "研究領域" "聯絡方式" 

我能值与该代码分配给各表:

> assign(eval(parse(text="Fac_table[[i]]")), as_tibble(matrix(fac_data, 
> nrow = length(headers[[i]]))) 

这导致填充的表,而不列标题,像这样的:

> honorary_fac_table 
    [,1]  [,2]  
V1 "名譽教授" "XXX" 
V2 "名譽教授" "XXX" 
V3 "名譽教授" "XXX" 
V4 "名譽教授" "XXX" 

但无法将列名分配给每个表。下面

的无论是代码工作:

> assign(colnames(eval(parse(text="Fac_table[1]"))), c(gsub("\\s", "", headers[[1]]))) 
Error in assign(colnames(eval(parse(text = "Fac_table[1]"))), c(gsub("\\s", : 
    第一個引數不正確 

> colnames(eval(parse(text="Fac_table[i]"))) <- c(gsub("\\s", "", headers[[i]])) 
Error in colnames(eval(parse(text = "Fac_table[i]"))) <- c(gsub("\\s", : 
    賦值目標擴充到非語言的物件 

> do.call("<-", colnames(eval(parse(text="Fac_table[i]"))), c(gsub("\\s", "", headers[[i]]))) 
Error in do.call("<-", colnames(eval(parse(text = "Fac_table[i]"))), c(gsub("\\s", : 
    second argument must be a list 

为了简化问题,重复的例子如下:

> varNamelist <- list(c("tbl1","tbl2","tbl3","tbl4")) 
> colHeaderlist <- list(c("col1","col2","col3","col4")) 
> tableData <- matrix([1:12], ncol=4) 

这工作:

> assign(eval(parse(text="varNamelist[[1]][1]")), matrix(tableData, ncol 
> = length(colHeaderlist[[1]]))) 

但是这不是:

> colnames(as.name(varNamelist[[1]][1])) <- colHeaderlist[[1]] 
Error in `colnames<-`(`*tmp*`, value = c("col1", "col2", "col3", "col4" : 
    attempt to set 'colnames' on an object with less than two dimensions 

这似乎是colnames()中的R的功能是不能处理由“Fac_table [I]”作为变量名,其中独立的数据(来自Fac_table分开)可以是所表示的串存储。

> colnames(as.name(Fac_table[[1]])) <- headers[[1]] 
Error in `colnames<-`(`*tmp*`, value = c("a", "b", "c", : 
    attempt to set 'colnames' on an object with less than two dimensions 

替换'fulltime_fac_table'可以直接正常工作。

> colnames(fulltime_fac_table) <- headers[[1]] 

是否有解决此问题的方法?

谢谢!

+0

我想帮忙,但请阅读SO标准问这个问题[链接这里](https://*.com/questions/5963269/how-to-make-a-great-r-reproducible -例)。它有助于简化要点。 – www

+0

适当添加了一个可重复的示例。谢谢。 – Sati

+0

@RyanRunge,我只需要一个合适的占位符来在线存储给定的表格,循环浏览URL列表,同时保持它们之间的区别。保留相应表格的变量名称列表可能不是一个好主意。所以,如果你能想到更好的方法来做到这一点,请与我分享。 – Sati

有一个解决方案,但我认为目前的设置可能比必要的更复杂,如果我理解正确。所以我会尽量让这个任务更容易。

如果您使用的是一维数据,我建议使用矢量,因为它们比用于该目的的列表更合适。因此,对于这个项目,我会开始通过存储表和标题的名称,就像这样:

varNamelist <- c("tbl1","tbl2","tbl3","tbl4") 
colHeaderlist <- c("col1","col2","col3","col4") 

它仍然难以确定这些表的输入数据格式和来源是从你的问题,但总的来说,只要您不使用大数据,有时数据框可能比矩阵更容易使用。分配功能对于这些步骤通常也不是必需的。取而代之的是,建立一个数据帧时,我们可以将数据帧的名称,列和数据内容的一下子,像这样的名字:

tbl1 <- data.frame("col1"=c(1,2,3), 
        "col2"=c(4,5,6), 
        "col3"=c(7,8,9), 
        "col4"=c(10,11,12)) 

同样,我们使用的载体,由c()而不是list()指出,以填充每列,因为每列都是它自己的单个维度。

要检查TBL1的输出,我们就可以使用打印():

print(tbl1) 

    col1 col2 col3 col4 
1 1 4 7 10 
2 2 5 8 11 
3 3 6 9 12 

如果它是创造更接近出这样的表的选项,这可能使比使用这么多的名单事情变得更简单并分配功能;这很快变得过于复杂。

但是,如果你想在结束所有的表存储在一个地方,你可以把它们放在一个列表:

tableList <– list(tbl1=tbl1,tbl2=tbl2,tbl3=tbl3,tbl4=tbl4) 

str(tableList) 
List of 4 
$ tbl1:'data.frame': 3 obs. of 4 variables: 
    ..$ col1: num [1:3] 1 2 3 
    ..$ col2: num [1:3] 4 5 6 
    ..$ col3: num [1:3] 7 8 9 
    ..$ col4: num [1:3] 10 11 12 
$ tbl2:'data.frame': 3 obs. of 4 variables: 
    ..$ col1: num [1:3] 1 2 3 
    ..$ col2: num [1:3] 4 5 6 
    ..$ col3: num [1:3] 7 8 9 
    ..$ col4: num [1:3] 10 11 12 
$ tbl3:'data.frame': 3 obs. of 4 variables: 
    ..$ col1: num [1:3] 1 2 3 
    ..$ col2: num [1:3] 4 5 6 
    ..$ col3: num [1:3] 7 8 9 
    ..$ col4: num [1:3] 10 11 12 
$ tbl4:'data.frame': 3 obs. of 4 variables: 
    ..$ col1: num [1:3] 1 2 3 
    ..$ col2: num [1:3] 4 5 6 
    ..$ col3: num [1:3] 7 8 9 
    ..$ col4: num [1:3] 10 11 12 
+0

@Sati - 好的,很好。很高兴帮助。 – www

+0

基于我找到的解决方案,我有一些后续问题。但我不认为我可以找到一个可重复的例子。不知道你是否也可以提供帮助?这完全是一个完全不同的问题。 – Sati

我发现基于@瑞安的建议,它的解决方案中的工作,由此代码给出:

for (i in seq_along(url)){ 

    webpage <- read_html(url[i]) #loop through URL list to access html data 

    fac_data <- html_nodes(webpage,'.tableunder') %>% html_text() 
    fac_data1 <- html_nodes(webpage,'.tableunder1') %>% html_text() 
    fac_data <- c(fac_data, fac_data1) #Store table data on each URL in a variable 

    x <- fac_data %>% matrix(ncol = length(headers[[i]]), byrow=TRUE) #make matrix to extract column data 

    for (j in seq_along(headers[[i]])){ 
    y <- cbind(x[,j]) #extract column data and store in temporary variable 
    colnames(y) <- as.character(headers[[i]][j]) #add column name 
    print(cbind(y)) #loop through headers list to print column data in sequence. ** cbind(y) will be overwritten when I try to store the result on a list with 'z <- cbind(y)'. 
    } 
} 

我现在可以打印出所有值,并附上有问题的数据标题。

后续问题已发布here


final code也解决了这个问题。

+3

如果您有后续问题,请将其作为单独问题发布。谢谢。 – Uwe

+0

@Uwe,好,注意。 – Sati