R中的colnames()函数-将表值视为独立对象/变量
我有一个值列表,我想用它作为从某个网站上的单独URL中刮取的单独表的名称R中的colnames()函数-将表值视为独立对象/变量,r,loops,object,instance-variables,R,Loops,Object,Instance Variables,我有一个值列表,我想用它作为从某个网站上的单独URL中刮取的单独表的名称 > 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 職稱
> 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"
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))
我有另一个名为“headers”的列表,其中包含在线各个表的列标题
> 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
但这并不是:
> 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(as.name(varNamelist[[1]][1]))有一个解决方案,但是如果我理解正确,我认为当前的设置可能比必要的更复杂。因此,我将努力使这项任务更容易
如果你使用的是一维数据,我建议你使用向量,因为它们比列表更适合这个目的。因此,对于这个项目,我首先存储表和头的名称,如下所示:
> fulltime_fac_table
職稱
V1 "教授兼系主任"
V2 "教授"
V3 "教授"
V4 "教授"
V5 "特聘教授"
> parttime_fac_table
職稱 姓名
V1 "教授" "XXX"
V2 "教授" "XXX"
V3 "教授" "XXX"
V4 "教授" "XXX"
V5 "教授" "XXX"
V6 "教授" "XXX"
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))
如果它是一个选项来创建更接近于所示方式的表,那么这可能比使用如此多的列表和赋值函数更容易;这很快就会变得过于复杂
但如果您希望在最后将所有表存储在一个位置,可以将它们放在一个列表中:
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
tableList有一个解决方案,但如果我理解正确,我认为当前的设置可能比必要的更复杂。因此,我将努力使这项任务更容易
如果你使用的是一维数据,我建议你使用向量,因为它们比列表更适合这个目的。因此,对于这个项目,我首先存储表和头的名称,如下所示:
> fulltime_fac_table
職稱
V1 "教授兼系主任"
V2 "教授"
V3 "教授"
V4 "教授"
V5 "特聘教授"
> parttime_fac_table
職稱 姓名
V1 "教授" "XXX"
V2 "教授" "XXX"
V3 "教授" "XXX"
V4 "教授" "XXX"
V5 "教授" "XXX"
V6 "教授" "XXX"
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))
如果它是一个选项来创建更接近于所示方式的表,那么这可能比使用如此多的列表和赋值函数更容易;这很快就会变得过于复杂
但如果您希望在最后将所有表存储在一个位置,可以将它们放在一个列表中:
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
tableList我根据@Ryan的建议找到了一个变通解决方案,代码如下:
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)'.
}
}
for(沿(url)顺序排列的i){
网页我根据@Ryan的建议找到了一个变通解决方案,代码如下:
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)'.
}
}
for(沿(url)顺序排列的i){
网页我很想提供帮助,但请阅读关于提问的SO标准。这有助于简化要点。已适当添加了一个可复制的示例。谢谢。@RyanRunge,我只需要一个合适的占位符来在线存储给定的表,在保持URL列表之间的区别的同时循环浏览URL列表。它甚至可能不需要为各个表保留一个变量名列表是一个好主意。因此,如果您能想出更好的方法,请与我分享。联机表似乎没有单独的节点用于单独的字段。我感谢您花时间澄清您的问题。小规模示例更清楚。我想我是st我想知道您的大示例中的数据是什么格式的,以及为什么要在这个过程中使用列表和赋值函数。通常不会这样做,也不一定是不正确的,但是可能有一种更简单、更标准的方法来做您要做的事情。我编辑了我的答案,试图解释一些可能有用的工具我很乐意帮忙,但请阅读关于提问的SO标准。这有助于简化基本内容。已适当添加了一个可复制的示例。谢谢。@RyanRunge,我只需要一个合适的占位符来在线存储给定的表,在保持URL列表之间的区别的同时循环浏览URL列表。可能为各个表保留一个变量名列表甚至不是一个好主意。因此,如果您能想出更好的方法,请与我分享。联机表似乎没有单独的节点用于单独的字段。我感谢您花时间澄清您的问题。使用较小规模的示例更清楚uess我仍然想知道您的大示例中的数据是什么格式的,以及为什么您希望在这个过程中使用列表和赋值函数。这通常不是这样做的,也不一定是不正确的,但可能有一种更简单、更标准的方法来做您尝试做的事情。我编辑了我的答案,试图解释一些在这个过程中可能会有所帮助。我有一些基于我找到的解决方案的后续问题。但我认为我找不到一个可复制的例子。不知道你是否也能帮上忙?这是一个完全不同的问题。我有一些基于我找到的解决方案的后续问题。但我认为我找不到一个可复制的例子举个例子。不知道你是否也能帮上忙?这是一个完全不同的问题。如果你有后续问题,请将其作为单独的问题发布。谢谢。@Uwe,好的,注意到。如果你有后续问题,请将其作为单独的问题发布。谢谢。@Uwe,好的,注意到。