【问题标题】:R: loop though multiple variablesR:循环遍历多个变量
【发布时间】: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&lt;- c("a", "b") 应该是 files&lt;- list(a, b)。在 {} 中包含你的 for 循环。想想new.names 的样子,new.namesab 会是什么
  • 好文件

标签: r for-loop input columnname


【解决方案1】:

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

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)
}

【讨论】:

  • 好吧,完美!我已经尝试了一些具有 1:length 函数和一些不同参数(具有不同结果)的解决方案,但我可能永远不会想出如此复杂的解决方案。现在我必须花时间来完全理解这一点。但无论如何,非常感谢你帮了我大忙!
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多