2015-08-14 4 views
0

Я получил множественные data.frames (из пакета наборов данных) загружается и я использую пакет svDialogs для некоторого простого ввода данныхR: петли, хотя несколько переменных

требуют (svDialogs)

< - ирис
б < - attitued

> 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.

Я думаю, что первое, что мне нужно, чтобы сохранить ранее загруженные dataframes в переменной

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). Фактически, он должен перейти к следующей переменной (new.nameb), как только он начнет повторять имена второго файла («b»).

выход, если я Don `T изменить предложенные оригинальные имена столбцов является:

> 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. их следует избегать, если есть другое решение (в лучшем случае, но не обязательно без использования дополнительных пакетов).

Любая помощь будет оценена с тех пор, как я действительно застрял на этом этапе.

+0

'для (м в названиях (а))' должен быть 'для (м в названиях (х)) ' – jeremycg

+0

Я пробовал это раньше, но когда я изменяю, диалоговое окно ввода не появляется. – Deset

+1

В этом коде есть множество ошибок - 'files <- c (" a "," b ")' должно быть 'files <- list (a, b)'. Включите для циклов в '{}'. Подумайте о том, что выглядит 'new.names', и какие' new.namesa' и 'b' будут – jeremycg

ответ

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

O.k, который работает просто отлично! Я пробовал некоторые решения с функцией ** 1: length ** и некоторым другим параметром (с разными результатами), но я, вероятно, никогда не придумал бы такого сложного решения. Теперь я должен потратить свое время, чтобы полностью понять это.Но в любом случае спасибо вам, что вы очень помогли мне! – Deset