Переименование переменной на основе значения предыдущей переменной - PullRequest
0 голосов
/ 13 января 2019

У меня есть следующий фрейм данных.

V1 <- c(2, 2, 2)
V2 <- c(12, 13, 24)
V3 <- c(3, 3, 3)
V4 <- c(1, 23, 33)
data <- data.frame(V1, V2, V3, V4)

data
  V1 V2 V3 V4
1  2 12  3  1
2  2 13  3 23
3  2 24  3 33

Я хочу переименовать V1 на основе значения в V1. Это означает, что я хочу переименовать переменную V2 в Var_2, где число 2 взято из V1.

  Var_2 Var_3
1    12     1
2    13    23
3    24    33

Есть ли простой способ сделать это? Я хочу повторить процесс для 500 переменных. Есть ли способ избежать петель?

Ответы [ 3 ]

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

Вот tidyverse возможность:

data %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 arrange(rowid) %>%
 mutate(temp = ifelse(parse_number(var) %% 2 == 0, 1, NA),
        var2 = ifelse(temp == 1 & is.na(lag(temp, default = 0)), 
                      paste("Var", lag(val), sep = "_"), NA)) %>%
 na.omit() %>%
 select(-var, -temp) %>%
 spread(var2, val) %>%
 select(-rowid)

  Var_2 Var_3
1    12     1
2    13    23
3    24    33

Сначала генерируется уникальный идентификатор строки. Во-вторых, он преобразует данные из широкого формата в длинный. В-третьих, он проверяет, состоят ли имена столбцов из четного числа. Если это так, он присваивает 1, в противном случае NA. Затем, если это четное число, а запаздывание равно NA, оно объединяет «Var» и значение из запаздывающего столбца. Наконец, он удаляет значения NA и возвращает его обратно в широкоформатный формат.

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

data.table подход: для 500 переменных вам придется разработать способы их удаления, не такие, как показано здесь. Также предполагается, что все столбцы будут иметь одинаковое значение, то есть 3333,2222 и т. Д.

data <- data.frame(V1, V2, V3, V4)
library(data.table)
setDT(data)
data1<-data[,list(V1,V3)]
#data1[,lapply(.SD,unique)]
data[,`:=`(V1=NULL,V3=NULL)]
names(data)<-do.call("paste",list("Var_",unique(data1)))
data


    Var_ 2    Var_ 3
1:     12      1
2:     13     23
3:     24     33
0 голосов
/ 13 января 2019

Может быть, я не получаю ваш вопрос, но пока вам нужны только имена из первого ряда ваших данных, что-то вроде этого должно работать:

names(data) <- paste("Var",data[1,][1:ncol(data)],sep="_")

> names(data)
[1] "Var_2"  "Var_12" "Var_3"  "Var_1" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...