List in R
http://www.r-tutor.com/r-introduction/list
http://dsmoon.tistory.com/entry/R언어4리스트
List 란?
- 다른 objects를 포함하는 generic vector
remove element of a List
LL <- list( "sixx", NULL, NULL, c(21,32,11), "bar")
[[1]] [1] "sixx" [[2]] NULL [[3]] NULL [[4]] [1] 21 32 11 [[5]] [1] "bar"
names(LL) <- seq_along(LL)
$`1` [1] "sixx" $`2` NULL $`3` NULL $`4` [1] 21 32 11 $`5` [1] "bar"
Remove by name
LL[["5"]] <- NULL
Remove by condition
LL[LL %in% "sixx"] <- NULL
Remove duplicated element
LL[duplicated(LL)]<-NULL
Remove NULL element
LL <- Filter(Negate(is.null), LL) #or LL[sapply(LL, print)] <- NULL #or LL[lengths(LL)!=0]
example2
https://statisticsglobe.com/remove-element-from-list-in-r
myList <- list( a = c(0, 8, 1, 9), b = 666, c = "sixx") #1. assign NULL myList[2] <- NULL myList[c(2,3)] <- NULL myList['c'] <- NULL #2. minus sign result <- myList[-2] result <- myList[-c(2,3)] #3. by Name result <- myList[names(myList) %in% "b"==FALSE] result <- myList[names(myList) %in% c("b","c")==FALSE] result <- myList[names(myList) !="b"]
col <- c('a','b') for(i in col){ i <- as.character(i) myList[i] <- NULL }
List 생성및 Member Reference
Vector
pre <- c(54, 64, 75) post <- c(53, 60, 70, 60) diet_named <- list(Before=pre, After=post) > diet_named $Before [1] 54 64 75 $After [1] 53 60 70 60 > diet_named[[1]] > diet_named$Before # same 이름이 있는 경우에만 [1] 54 64 75
diet_unnamed <- list(pre, post) > diet_unnamed [[1]] [1] 54 64 75 [[2]] [1] 53 60 70 60 > diet_unnamed[[1]] [1] 54 64 75 > diet_unnamed$Before # 활용불가!! NULL
DataFrame
predd <- data.table( height=c(54, 64, 75), weight=c(49, 52, 77)) postdd <- data.table( height=c(53, 60, 70), weight=c(49, 53, 70)) diet_DD <- list(Before=predd, After=postdd) > predd %>% class # element is Data.Table [1] "data.table" "data.frame" > diet_DD[[1]] %>% class [1] "data.table" "data.frame"
unlist (Flatten Lists)
use.names = TRUE 인 경우, list명 + column명 + row 명 순
> diet_named %>% unlist() Before1 Before2 Before3 After1 After2 After3 After4 54 64 75 53 60 70 60 > diet_unnamed %>% unlist() [1] 54 64 75 53 60 70 60 > diet_DD %>% unlist() # length 12인 numeric Vector Before.height1 Before.height2 Before.height3 Before.weight1 Before.weight2 Before.weight3 After.height1 After.height2 After.height3 After.weight1 54 64 75 49 52 77 53 60 70 49 After.weight2 After.weight3 53 70
recursive=F 인 경우, Flatten가능한 부분까지 ...
recursive=F 인 경우, 가장 상위 List만 Flatten 시킨다.
test <- list(Before=pre, After=postdd) $Before [1] 54 64 75 $After height weight 1: 53 49 2: 60 53 3: 70 70 > test %>% unlist() > test %>% unlist(recursive=F)%>% unlist(recursive=F) #same Before1 Before2 Before3 After.height1 After.height2 After.height3 After.weight1 After.weight2 After.weight3 54 64 75 53 60 70 49 53 70 > test %>% unlist(recursive=F) $Before1 [1] 54 $Before2 [1] 64 $Before3 [1] 75 $After.height [1] 53 60 70 $After.weight [1] 49 53 70
nested list
ui = fluidPage( selectizeInput("state", "Choose a state:", choices="", multiple=F), textOutput("result") ) server = function(input, output, session) { # choiceList <- list( `2019-01-01` = list("2019-01-01-10.fst", "2019-01-01-2.fst", "2019-01-01-11.fst"), # `2019-02-01` = list("2019-02-01-12.fst", "2019-02-01-all.fst"), # `2019-03-01` = list("2019-03-01-3.fst", "2019-03-01-20.fst", "2019-03-01-10.fst")) files <- c("2019-01-01-10.fst", "2019-01-01-2.fst", "2019-01-01-11.fst", "2019-02-01-12.fst", "2019-02-01-all.fst", "2019-03-01-3.fst", "2019-03-01-20.fst", "2019-03-01-10.fst") groups <- str_sub(files, start=1, end=10) %>% unique() choiceList <- vector("list", length(groups)) names(choiceList) <- groups for(i in seq_along(groups)){ choiceList[[i]] <- files[str_detect(files, groups[i])] %>% str_replace_all(".fst","") %>% str_split(" ") } updateSelectizeInput(session, inputId="state", choices=choiceList) output$result <- renderText({ paste("You chose", input$state) }) } shinyApp(ui, server)
vector vs. unvector(?)
> lc <- list(c("A","B","C")) > lc [[1]] [1] "A" "B" "C" ---------------------------------------- lc <- c("A","B","C") %>% str_split(" ") identical(l, lc) ---------------------------------------- > lc[[1]] [1] "A" "B" "C" > lc[[2]] Error in lc[[2]] : subscript out of bounds > lc[1] [[1]] [1] "A" "B" "C" > lc[2] [[1]] NULL
> l <- list("A","B","C") > l [[1]] [1] "A" [[2]] [1] "B" [[3]] [1] "C" > l[[1]] [1] "A" > l[[2]] [1] "B" > l[1] [[1]] [1] "A" > l[2] [[1]] [1] "B"
Convert List to DT
#by row & column do.call(cbind, myList)) %>% as.data.table() do.call(cbind, myList)) %>% as.data.table()