【发布时间】:2015-08-14 13:56:11
【问题描述】:
我已经加载了多个 data.frames(来自数据集包) 我使用 svDialogs 包进行一些简单的数据输入
需要(svDialogs)
a b
> a
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
and so on
> b
rating complaints privileges learning raises critical advance
1 43 51 30 39 61 92 45
2 63 64 51 54 63 73 47
3 71 70 68 69 76 86 48
4 61 63 45 47 54 84 35
5 81 78 56 66 71 83 47
and so on
加载的数据帧并不总是相同的,并且是从前面的步骤派生的,因此它们的命名和编号可以改变。
我现在要做的是遍历这些数据框并询问如何重命名列名以及每个数据 在这种情况下,框架应该得到一个新变量 new.names[FILENAME] new.names.a 和 new.names.b 以便在后面的步骤中可以 被指定为特定 data.frames 的新列名。
我认为我需要的第一件事是将之前加载的数据帧存储在一个变量中
files<- c("a", "b")
并应用这样的东西:
new.names <- c()
for (x in files)
for (m in names(a))
new.names <- c(new.names,dlgInput(sprintf('Enter new column name or press ok: "%s"', m), default=m, Sys.info()["n"])$res)
for(i in files)
assign(paste("new.names", i,sep=""), new.names)
它适用于一个数据框,但不适用于多个(它只是重复同一数据框的列名,次数与值相同 在“文件”变量中)。并将输入的新列名分配给所有新创建的变量(new.namesa、new.namesb)。实际上,它应该在开始迭代第二个文件(“b”)的名称时立即跳到下一个变量(new.nameb)。
如果我不更改建议的原始列名,输出是:
> new.namesa
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species" "Sepal.Length"
[7] "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
> new.namesb
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species" "Sepal.Length"
[7] "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
那么有没有可能解决这个问题?我不热衷于使用循环 - 我已经多次阅读过在 R 中应该避免这些循环。 - 如果有另一种解决方案(在最好的情况下,但不一定不使用额外的包)。
任何帮助将不胜感激,因为我真的被困在这一点上。
【问题讨论】:
-
for (m in names(a))应该是for (m in names(x)) -
我之前尝试过,但是当我更改时没有出现输入对话框。
-
这段代码中有很多错误 -
files<- c("a", "b")应该是files<- list(a, b)。在{}中包含你的 for 循环。想想new.names的样子,new.namesa和b会是什么 -
好文件
标签: r for-loop input columnname