R遍历数据表中的列-可能的setnames()错误?

时间:2018-08-30 15:22:35

标签: r loops

for循环用于通过使用setnames()将列名更改为“ selcol”来选择数据表的每一列。在完整的代码中,每个列多次使用不同的人数应用于列条件。然后,将列名称更改回其原始名称。这似乎是一个错误,因为setnames()在比指定数据表更多的地方更改了列名。此外,setnames()函数不会将列名改回来。如果不使用循环,而是将索引y = 1,y = 2设置为...,则不会发生此错误;它仅在运行循环时发生。我尝试定义一个临时表,并尝试定义列名称的向量,但是当我在这些对象中使​​用setnames()时,名称将在永久表和应保留的名称向量中更改不变。我尝试了一个数据表和一个数据框。我想知道这是否是程序包中的错误,还有选择另一列的另一种实用方法吗?

norows = 5
nocols = 7

mtrx_perm <- as.data.table(matrix(round(rnorm(norows*nocols), digits = 3), ncol = nocols, byrow = T))

colnames(mtrx_perm) <- as.character(seq(0:6)-1)

resetnames <- colnames(mtrx_perm)

vect_temp = rep(0, norows)
for (y in 1: nocols){
mtrx_temp <- mtrx_perm
setnames(mtrx_temp, as.character(y-1), "selcol")
vect_add <- mtrx_temp$selcol
#setnames(mtrx_temp, "selcol", as.character(y-1))
colnames(mtrx_temp) <- resetnames
vect_temp <- vect_temp + vect_add
}

mtrx_perm
mtrx_temp
vect_temp
apply(mtrx_perm, 1, sum)

1 个答案:

答案 0 :(得分:0)

我对data.table不太了解,但是似乎setnames更改了mtrx_permmtrx_temp的名称,我认为这与{ {1}}改变了事情。无论如何,我用data.table取代了setnames,效果很好

colnames

我也不知道为什么要通过更改列名来选择列?为什么不直接更直接地遍历列名呢?您表明自己知道使用library(data.table) norows = 5 nocols = 7 mtrx_perm <- as.data.table(matrix(round(rnorm(norows*nocols), digits = 3), ncol = nocols, byrow = T)) colnames(mtrx_perm) <- as.character(seq(0:6)-1) resetnames <- colnames(mtrx_perm) vect_temp = rep(0, norows) for (y in 1: nocols){ mtrx_temp <- mtrx_perm colnames(mtrx_temp)[y] <- "selcol" vect_add <- mtrx_temp$selcol colnames(mtrx_temp) <- resetnames vect_temp <- vect_temp + vect_add } mtrx_perm mtrx_temp vect_temp apply(mtrx_perm, 1, sum) 解决示例的更好方法,因此可以创建一个示例来说明用例需要循环吗?