создать переменную и добавить к фрейму данных в цикле в R - PullRequest
0 голосов
/ 25 ноября 2018

Новый для R, я пытаюсь переименовать / создать переменную в цикле «for», присвоить счетчику «i» его имя и сохранить его во фрейме данных.Я не могу найти способ присвоить счетчику имя:

 df.final <- NULL
 for(i in 1:n) {
  print(i)
  v1[i] <- df$v1 ############## I need help with this
  df$v1[i] <- v1[i] ############## and this
  if(i==1){
     df.final <- df
  } else {
     df.final <- merge(df.final, df, by = "ID")
  }
 }

Я обнаружил следующее:

 tmpvar <- paste("v1", i, sep= "")
 assign(tmpvar, df$v1)

, который помогает с созданием переменной, специфичной для цикла (первая часть),но тогда как мне добавить эту переменную во фрейм данных (вторая часть)?

Буду признателен за любую помощь в этом.

Спасибо, Амир

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

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

for (i in 1:3){
  col_name <- paste0('add',i) 
  df_temp <- data.frame(add=runif(5))  #the new column you want to add
  colnames(df_temp) <- col_name       #change the column name 
  if (i==1){
    df_final <- df_temp
  }else{
    df_final <- cbind(df_final,df_temp)
  }
}

df_final
        add1      add2      add3
1 0.02338753 0.7503266 0.4517581
2 0.94139957 0.6460098 0.6369646
3 0.81601567 0.1825294 0.1289575
4 0.61678986 0.6715657 0.3979930
5 0.11424770 0.7712202 0.9129960
0 голосов
/ 25 ноября 2018

Спасибо вам обоим!Очень полезно и полезно для меня.

Основываясь на ваших ответах, я уточняю свой вопрос:

 n <- 5

 df.final <- NULL

 for(i in 1:n) {
 df<- as.data.frame(rbind(c(1,runif(1),100),c(2,runif(1),100),c(3,runif(1),100)))
   colnames(df)<- c("ID","v1","redundant")
   df[paste(colnames(df[2]),toString(i),sep ="_")] <- df[2] 
   df <- df[c("ID",colnames(df)[ncol(df)])] ### This works as I am referring to my new variable thorugh its column number but I still don't know how to identify the new variable, v1_i, through iterations? 
     if(i==1){
     df.final <- df
   } else {
     df.final <- merge(df.final, df, by = "ID")
   }
 }

Я совсем недавно перешел на R из Stata, и хотя я привык кодировать в Matlab,Мне просто нужно время, чтобы приспособить свой разум к новому стилю вектора / матрицы, а не к переменной / панели.Любое улучшение в этом коде высоко ценится!:)

0 голосов
/ 25 ноября 2018

Добро пожаловать в сообщество R!Это помогло бы, если бы вы могли прояснить вашу проблему немного с помощью примера кода (ввод, желаемый вывод).Я предполагаю, что вы пытаетесь создать новую переменную в каждом цикле?Может быть, поможет следующее:

Предположим, мы сделаем 3 итерации.Я создам простой пример набора данных с 2 столбцами

n <- 3
# create an example dataframe with 2 columns
df<- as.data.frame(rbind(c(1,1),c(2,2),c(1,2)))
colnames(df)<- c("v1","ID")

Далее создадим пустой data.frame.На последнем шаге вы не можете присоединиться по столбцу ID, если df.final не имеет столбца с таким именем!

`df.final <- data.frame(matrix(ncol = 2, nrow = 0))
colnames(df.final)<- c("v1","ID")

Давайте сделаем цикл for

for(i in 1:n) {
  df[paste(colnames(df[1]),toString(i),sep ="_")] <- df[1] 
  if(i==n){
    df.final <- df
  } else {
    df.final <- merge(df.final, df, by = "ID") #there is no point of doing the join in my example!
  }
}

Поскольку я не уверен, что именно вы хотели сделать, я написал некоторый код, который копирует содержимое столбца 1 и записывает его в столбец, имя которого совпадает с именем столбца плюс суффикс I. Итак, давайте посмотрим наоператор:

colnames(df[1]) возвращает имя первого столбца кадра данных в виде строки (var1) toString(i) преобразует ваш итератор i в строку. Используя функцию baste с sep ="_", выобъедините имя первого столбца и вашего итератора в одну строку.

df["varname"] 

- это способ ссылки на столбец в кадре данных.

Ваш вывод будет выглядеть следующим образом

  v1 ID v1_1 v1_2 v1_3
1  1  1    1    1    1
2  2  2    2    2    2
3  1  2    1    1    1

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...