R 中的 colnames() 函数 - 将 table 值视为独立值 objects/variables
colnames() function in R - Treating table values as independant objects/variables
我有一个值列表,我想将其用作从某个网站上的单独 URL 中抓取的单独 table 的名称。
> Fac_table
[[1]]
[1] "fulltime_fac_table"
[[2]]
[1] "parttime_fac_table"
[[3]]
[1] "honorary_fac_table"
[[4]]
[1] "retired_fac_table"
我想遍历列表以自动生成 4 个具有各自名称的 table。
结果应如下所示:
> fulltime_fac_table
職稱
V1 "教授兼系主任"
V2 "教授"
V3 "教授"
V4 "教授"
V5 "特聘教授"
> parttime_fac_table
職稱 姓名
V1 "教授" "XXX"
V2 "教授" "XXX"
V3 "教授" "XXX"
V4 "教授" "XXX"
V5 "教授" "XXX"
V6 "教授" "XXX"
我有另一个列表,名为 'headers',其中包含各个 table 的在线列标题。
> headers
[[1]]
[1] "職稱" "姓名" " 研究領域"
[4] "聯絡方式"
[[2]]
[1] "職稱" "姓名" "研究領域" "聯絡方式"
我能够使用以下代码为相应的 table 分配值:
> assign(eval(parse(text="Fac_table[[i]]")), as_tibble(matrix(fac_data,
> nrow = length(headers[[i]])))
这会导致填充 table,没有列标题,如下所示:
> honorary_fac_table
[,1] [,2]
V1 "名譽教授" "XXX"
V2 "名譽教授" "XXX"
V3 "名譽教授" "XXX"
V4 "名譽教授" "XXX"
但无法为每个 table 分配列名。
以下代码均无效:
> 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
R 中的colnames() 函数似乎无法将"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]]
有什么办法可以解决这个问题吗?
谢谢!
有一个解决方案,但我认为如果我理解正确的话,当前的设置可能比必要的更复杂。所以我会尽量简化这个任务。
如果您正在处理 one-dimensional 数据,我建议您使用向量,因为它们比列表更适合用于该目的。所以对于这个项目,我首先存储 tables 和 headers 的名称,如下所示:
varNamelist <- c("tbl1","tbl2","tbl3","tbl4")
colHeaderlist <- c("col1","col2","col3","col4")
仍然很难确定这些 table 输入的数据格式和来源是什么,但一般来说,有时数据框比矩阵更容易处理,因为只要您不使用大数据。这些步骤通常也不需要 assign 函数。相反,在设置数据框时,我们可以同时应用数据框的名称、列的名称和数据内容,如下所示:
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():
print(tbl1)
col1 col2 col3 col4
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
如果可以选择创建更接近这种方式的 table,这可能比使用这么多列表和分配函数更容易;这很快就会变得过于复杂。
但是如果你想在最后将所有 table 存储在一个地方,你可以将它们放在一个列表中:
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
我根据@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)'.
}
}
我现在可以打印出所有值,包括 headers 相关数据。
Follow-up 个问题已发布 here。
final code 也解决了这个问题。
我有一个值列表,我想将其用作从某个网站上的单独 URL 中抓取的单独 table 的名称。
> Fac_table
[[1]]
[1] "fulltime_fac_table"
[[2]]
[1] "parttime_fac_table"
[[3]]
[1] "honorary_fac_table"
[[4]]
[1] "retired_fac_table"
我想遍历列表以自动生成 4 个具有各自名称的 table。
结果应如下所示:
> fulltime_fac_table
職稱
V1 "教授兼系主任"
V2 "教授"
V3 "教授"
V4 "教授"
V5 "特聘教授"
> parttime_fac_table
職稱 姓名
V1 "教授" "XXX"
V2 "教授" "XXX"
V3 "教授" "XXX"
V4 "教授" "XXX"
V5 "教授" "XXX"
V6 "教授" "XXX"
我有另一个列表,名为 'headers',其中包含各个 table 的在线列标题。
> headers
[[1]]
[1] "職稱" "姓名" " 研究領域"
[4] "聯絡方式"
[[2]]
[1] "職稱" "姓名" "研究領域" "聯絡方式"
我能够使用以下代码为相应的 table 分配值:
> assign(eval(parse(text="Fac_table[[i]]")), as_tibble(matrix(fac_data,
> nrow = length(headers[[i]])))
这会导致填充 table,没有列标题,如下所示:
> honorary_fac_table
[,1] [,2]
V1 "名譽教授" "XXX"
V2 "名譽教授" "XXX"
V3 "名譽教授" "XXX"
V4 "名譽教授" "XXX"
但无法为每个 table 分配列名。
以下代码均无效:
> 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
R 中的colnames() 函数似乎无法将"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]]
有什么办法可以解决这个问题吗?
谢谢!
有一个解决方案,但我认为如果我理解正确的话,当前的设置可能比必要的更复杂。所以我会尽量简化这个任务。
如果您正在处理 one-dimensional 数据,我建议您使用向量,因为它们比列表更适合用于该目的。所以对于这个项目,我首先存储 tables 和 headers 的名称,如下所示:
varNamelist <- c("tbl1","tbl2","tbl3","tbl4")
colHeaderlist <- c("col1","col2","col3","col4")
仍然很难确定这些 table 输入的数据格式和来源是什么,但一般来说,有时数据框比矩阵更容易处理,因为只要您不使用大数据。这些步骤通常也不需要 assign 函数。相反,在设置数据框时,我们可以同时应用数据框的名称、列的名称和数据内容,如下所示:
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():
print(tbl1)
col1 col2 col3 col4
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
如果可以选择创建更接近这种方式的 table,这可能比使用这么多列表和分配函数更容易;这很快就会变得过于复杂。
但是如果你想在最后将所有 table 存储在一个地方,你可以将它们放在一个列表中:
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
我根据@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)'.
}
}
我现在可以打印出所有值,包括 headers 相关数据。
Follow-up 个问题已发布 here。
final code 也解决了这个问题。