Как динамически назначить имя столбца переменной - PullRequest
0 голосов
/ 15 января 2019

Я сейчас занимаюсь разработкой приложения, и мне нужно пройтись по столбцам фрейма данных. Например, если во фрейме данных есть столбцы

char_set <- data.frame(character(),character(),character(),character(),stringsAsFactors = FALSE)
names(char_set) <-  c("a","b","c","d")

Если ввод задан как «a», тогда переменной должно быть присвоено имя столбца «b», скажем, promo. Выдает ошибку Error in [. Data.frame (char_set, i + 1) : undefined columns selected. Есть ли решение?

char_name <- "a"
char_set <- data.frame(character(),character(),character(),character(),stringsAsFactors = FALSE)
names(char_set) <-  c("a","b","c","d")
for (i in 1:ncol(char_set)) {
  promote <- ifelse(names(char_set) == char_name,char_set[i+1], "-")
  print(promote)
}

Заранее спасибо !!!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Проблема в вашем коде состоит в том, что вы циклически изменяете от 1 до количества столбцов char_set df, затем вы вызываете переменную char_set[i+1]. Таким образом, когда индекс i принимает максимальное значение, инструкция char_set[i+1] возвращает ошибку, поскольку элемент с таким индексом отсутствует.

Вы можете попробовать это решение:

char_name<-"a"

promote<-ifelse((which(names(char_set)==char_name)+1)<ncol(char_set),names(char_set)[which(names(char_set)==char_name)+1],"-")

promote
> [1] "b"

char_name<-"d"

promote<-ifelse((which(names(char_set)==char_name)+1)<ncol(char_set),names(char_set)[which(names(char_set)==char_name)+1],"-")
promote

> [1] "-"

Тем не менее. когда переменная char_name принимает значение a, переменная продвижение примет значение, которое набор char_set имеет в позиции после элемента с именем a, что соответствует char_name.

Я предлагаю вам подумать о случае, когда переменная char_name принимает значение d, и у вас нет никаких значений в char_set после d.

0 голосов
/ 15 января 2019

Это на самом деле довольно интересно. Я бы посоветовал сделать что-то в этом направлении:

char_name <- "a"
char_set <- data.frame(
    a = 1:2,
    b = 3:4,
    c = 5:6,
    d = 8:9,
    stringsAsFactors = FALSE
)
res_dta <- data.frame(matrix(nrow = 2, ncol = 3))
for (i in wrapr::seqi(1, NCOL(char_set) - 1)) {
    print(i)
    if (names(char_set)[i] == char_name) {
        res_dta[i] <- char_set[i + 1]
    } else {
        res_dta[i] <- char_set[i]
    }
}

Результаты

char_set
  a b c d
1 1 3 5 8
2 2 4 6 9
res_dta
  X1 X2 X3
1  3  3  5
2  4  4  6

Есть несколько общих точек:

  • Когда вы просматриваете столбцы, будьте внимательны и не выходите за пределы измерений фрейма данных; выполнение i + 1 на i = 4 даст вам столбец 5, который возвратит ошибку для фрейма данных с четырьмя столбцами. Затем вы можете решить работать на один столбец меньше или разбить на определенное значение i
  • Не уверен, правильно ли я понял ваш запрос, для имен столбцов a вы хотите принять значения столбца b; тогда столбец b останется как был?
    • Вообще говоря, я считаю, что это names(char_set)[i] == char_name требует больше размышлений, но вы должны начать с этого ответа. Обновление вашего сообщения с желаемыми результатами поможет разработать решение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...