R:遍历多个变量

R: loop though multiple variables

我已经加载了多个 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)

好吧,它适用于一个数据框,但不适用于多个数据框(它只是重复同一数据框的列名,次数与值相同 在 "files" 变量中)。并将输入的新列名分配给所有新创建的变量(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 中应该避免使用循环——如果有另一种解决方案(在最好的情况下,但不一定不使用额外的包)。

任何帮助将不胜感激,因为我真的被困在这一点上。

你的代码有点乱,这里有一个更简单的方法来做你想做的事:

require (svDialogs)
a <- iris
b <- attitude

dfs <- c("a", "b")

for(df in dfs) {
  df.tmp <- get(df)
  for(i in 1:length(names(df.tmp))){
    names(df.tmp)[i] <- dlgInput(sprintf('Enter new column name or press ok: "%s"', names(df.tmp)[i]), default=names(df.tmp)[i], Sys.info()["n"])$res
  }
  assign(df, df.tmp)
}