для итерации l oop для создания новых столбцов в R - PullRequest
1 голос
/ 24 января 2020

Я хотел бы добавить несколько столбцов, а не все. Например, если у меня есть набор данных:

` data <- data.frame(A = c(100, 200, 300), 
               B = c('A50', 'B60', 'C70')
               c = c(900, 800, 700))

, я бы хотел использовать подстроки столбцов A и B, но не C.

  select_col <- c("A", "B")

 for col in select_col {
   newcolA = substr(colA, 1, 3)
   newcolB = substr(colB, 1, 3)
  }

Как правильно написать для l oop? У моего фактического набора данных есть сотни столбцов, и у меня есть более 20 столбцов для подстроки.

Ответы [ 2 ]

1 голос
/ 24 января 2020

Это может быть немного более интуитивно понятно для новых пользователей R:

data <- data.frame(A = c(100, 200, 300), 
                   B = c('A50', 'B60', 'C70'),
                   c = c(900, 800, 700))

select_col <- c("A", "B")

for(a in select_col) {
  data[[paste0("newcol", a)]] <- substr(data[[a]], 1, 3)
}

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

newdata <- data.frame(matrix(nrow = 3, ncol = 0))

, а затем изменить data в l oop на newdata. Если вы действительно хотите отдельный вектор для каждого (как подсказывает ваш код), вы можете использовать assign, но я предполагаю, что вы этого не сделаете.

1 голос
/ 24 января 2020

Вы можете использовать sapply для вектора столбцов (или lapply):

sapply(data[,select_col], substring, 1, 3)

     A     B    
[1,] "100" "A50"
[2,] "200" "B60"
[3,] "300" "C70"

Чтобы изменить столбец и сохранить его в том же кадре данных:

cbind(data, setNames(lapply(data[,select_col], substring, 1, 3), paste0("new", select_col)))
    A    B   c newA newB
1 100 A501 900  100  A50
2 200 B602 800  200  B60
3 300  C70 700  300  C70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...