Как я могу заменить различные столбцы в таблице с помощью select?

Я пытаюсь заменить все столбцы, выбранные с помощью select, данными того же размера. Воспроизводимый пример:

library(tidyverse)
iris = as_data_frame(iris)
temp = cbind( runif(nrow(iris)), runif(nrow(iris)), runif(nrow(iris)), runif(nrow(iris)))
select(iris, -one_of("Petal.Length"))  = temp

Тогда я получаю сообщение об ошибке

Ошибка в select (iris, -one_of ("Petal.Length")) = temp: не удалось найти функцию "select"

Спасибо за любые комментарии.


person Richard    schedule 12.01.2017    source источник
comment
Не так удобно, но iris[,!grepl("Petal.Length",colnames(iris))]=tempworks   -  person Haboryme    schedule 12.01.2017
comment
дело не в том, что R не находит функцию select, а скорее select<-. Поведение, которое вы хотите а-ля rownames, отличается от того, что может делать select.   -  person Drey    schedule 12.01.2017
comment
@Haboryme, спасибо. Я знаю - с обычным подходом data.frame это правильный путь. Я просто подумал, что есть способ сделать это аккуратно.   -  person Richard    schedule 12.01.2017


Ответы (3)


Вы хотите связать столбцы двух фреймов данных, поэтому можете просто использовать bind_cols():

library(tidyverse)

iris <- as_tibble(iris)
temp <- tibble(r1 = runif(nrow(iris)), r2 = runif(nrow(iris)), r3 = runif(nrow(iris)), r4 = runif(nrow(iris)))

select(iris, -Petal.Length) %>% bind_cols(temp)
# or use:
# bind_cols(iris, temp) %>% select(-Petal.Length)

что дает вам:

# A tibble: 150 × 8
   Sepal.Length Sepal.Width Petal.Width Species        r1        r2         r3        r4
          <dbl>       <dbl>       <dbl>  <fctr>     <dbl>     <dbl>      <dbl>     <dbl>
1           5.1         3.5         0.2  setosa 0.7208566 0.1367070 0.04314771 0.4909396
2           4.9         3.0         0.2  setosa 0.4101884 0.4795735 0.75318182 0.1463689
3           4.7         3.2         0.2  setosa 0.6270065 0.5425814 0.26599432 0.1467248
4           4.6         3.1         0.2  setosa 0.8001282 0.4691908 0.73060637 0.0792256
5           5.0         3.6         0.2  setosa 0.5663895 0.4745482 0.65088630 0.5360953
6           5.4         3.9         0.4  setosa 0.8813042 0.1560600 0.41734507 0.2582568
7           4.6         3.4         0.3  setosa 0.5046977 0.9555570 0.22118401 0.9246906
8           5.0         3.4         0.2  setosa 0.5283764 0.4730212 0.24982471 0.6313071
9           4.4         2.9         0.2  setosa 0.5976045 0.4717439 0.14270551 0.2149888
10          4.9         3.1         0.1  setosa 0.3919660 0.5125420 0.95001067 0.5259598
# ... with 140 more rows
person Daniel    schedule 12.01.2017
comment
Вы также можете сначала привязать, а затем выбрать, см. Мой обновленный пример. - person Daniel; 12.01.2017
comment
bind! = Заменить; если привязка - это то, что хочет OP, то желательно исправить вопрос ... - person Drey; 12.01.2017
comment
Технически вы выбираете столбцы одного фрейма данных и объединяете / связываете их со столбцами другого фрейма данных. Конечно, для точной замены также потребуется проверить индексы столбцов удаленных столбцов и переупорядочить объединенный фрейм данных, чтобы новые столбцы также находились на позициях удаленных столбцов (что имеет значение, когда удаленные столбцы распределены случайным образом). - person Daniel; 12.01.2017

Мы можем использовать ->, чтобы назначить вывод для 'temp'

select(iris, -one_of("Petal.Length"))  -> temp
person akrun    schedule 12.01.2017
comment
спасибо, но я хочу, чтобы температура была в тибле, а не в столбцах тибла в темп. - person Richard; 12.01.2017

Используя парадигму tidyverse, вы можете использовать:

dplyr::mutate_at(iris, vars(-one_of("Petal.Length")), .funs = funs(runif))

Хотя приведенный выше пример дает поведение со случайными числами, он, вероятно, не будет соответствовать вашим потребностям - я полагаю, вы хотите сопоставить функции и строки с тем, что в temp.

Это можно сделать, преобразовав iris и temp в длинный формат и, например, объединив и заменив данные соответственно методами *join.

person Drey    schedule 12.01.2017
comment
Спасибо. Я просто хочу заменить столбцы в тибле значениями в temp. - person Richard; 12.01.2017
comment
Тогда подход @Haboryme в комментарии - самый прямой способ сделать это. (так почему вы вообще хотите использовать select?) - person Drey; 12.01.2017
comment
Я хочу заменить столбцы, и, поскольку подход tidyverse широко разрекламирован, я подумал, что постараюсь придерживаться его. - person Richard; 12.01.2017