2017-02-22 34 views
2
library(tidyverse) 
data(mtcars) 
mtcars <- rownames_to_column(mtcars,var = "car") 
mtcars$id <- c(1:length(mtcars$car)) 
mtcars$make <- map_chr(mtcars$car,~strsplit(.x," ")[[1]][1]) 

mt2 <- mtcars %>% select(1:4,id,make) %>% nest(-make,.key = "l") 
mt4 <- mt2[1:5,] 
mt5 <- mt2[1:5,] 

`Набор частей listcolumn к NULL в R

Теперь - Я бы хотел иметь listcolumn для мазда установлено значение NULL.

mt4[mt4$make=="Mazda","l"]<-NULL 

Однако, сравнивая mt4$l с mt5$l я считаю, что элементы «Мазды», были удалены, но что другие элементы смещены вверх. Может ли кто-нибудь объяснить, почему это логично? Как я могу выбрать только NULL для определенного элемента в столбце списка?

+1

Всегда включайте не-базовые пакеты в свой пример кода. – r2evans

ответ

3

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

library(dplyr) 
library(purrr) 
library(tidyr) 
library(tibble) 

(или просто library(tidyverse), я считаю).

Привязывая NULL к этому элементу, вы указываете R на , удалите этот элемент из списка, тем самым сделав его короче. Если вы хотите, чтобы заменить элемент с NULL элементом, попробуйте

mt4[mt4$make=="Mazda","l"] <- list(list(NULL)) 

вместо этого. (Это также срабатывает, если условие mt4$make=="Mazda" должно было возвращать несколько совпадений, что явно не является фактором с этим примером, но полезно знать.)

+1

Дополнительный пример: Попробуйте «mtcars [1, 1] <- NULL', вы получите« Ошибка: замена имеет нулевую длину » – Gregor

+0

И спасибо за предоставление отдельных пакетов - мне не нравится прикреплять * все *. – Gregor

+0

Thx. Я все еще не совсем понимаю список (list()) - не могли бы вы объяснить, почему нужен двойной список. – Misha