【发布时间】:2019-11-24 15:54:51
【问题描述】:
我正在使用循环来使用 cbind 重命名列。每次我尝试使用循环索引 (i) 命名列时,它不使用索引,而是将 i 放入列名。我希望它显示原始名称中的实际名称
x <- seq(0, 50, by = 1)
y <- seq(50, 100, by = 1)
z <- seq(25, 75, by = 1)
df <- data.frame(cbind(x, y, z))
df_final <- NULL
for (i in colnames(df)){
#PROBLEM: Column names becomes i instead of the actual column names
df_final <- cbind(df_final, i = df[,i])
}
df_final
【问题讨论】:
-
data.frame(cbind(x, y, z))之后的列名已经是x y z。你想在循环中做什么? -
旁注:尽量避免用
data.frame(cbind(...))创建数据框;充其量是多余的,最坏的情况是会导致意外/不正确的结果。data.frame(x = x,y = y,z = z)就足够了。 -
对于您的问题,
cbind是重命名列名的错误工具。您可以使用df_final[["new_col"]] <- foo创建一个新列,并使用存储在df_final[[bar]] <- foo变量中的名称来执行此操作,其中bar <- "new_var"。 -
@joran,您知道迭代
cbinding 是否与迭代rbinding 具有相同的后果(内存方面)?也就是说,cbind操作是每次都完全复制帧,还是只是有效地扩展list? -
@r2evans 我猜
cbind在数据帧上调用时实际上只是data.frame(...)的包装器,它已经变得相当高效。当我用tracemem尝试一个小例子时,我没有看到任何复制的证据。
标签: r loops rename cbind columnname