防止数据框列表中的名称消失

dmv*_*nna 6 r list dataframe

所以我初始化一个列表,我想用数据帧填充:

listz <- vector("list",2)
Run Code Online (Sandbox Code Playgroud)

我还想保留数据帧的名称,所以我分配它们:

listzNames <- c("frame1","frame2")
names(listz) <- listzNames
Run Code Online (Sandbox Code Playgroud)

问题是,每次重新分配给数据帧,名称都为NULL:

listz <- list(data.frame("id" = 1:3, "hat" = 1:3),
           data.frame("id" = 4:6, "hat" = 4:6))

> names(listz)
NULL
Run Code Online (Sandbox Code Playgroud)

我知道为什么会发生这种情况,但在每次数据帧重新分配时重新分配名称的替代方案是什么呢?

mne*_*nel 11

当你分配

listz <- list(data.frame("id" = 1:3, "hat" = 1:3),
           data.frame("id" = 4:6, "hat" = 4:6))
Run Code Online (Sandbox Code Playgroud)

您正在替换以前定义的对象listz,它是一个新对象,与该名称的任何先前对象无关.

因此在这种情况下无需初始化列表

你有(至少)四个选项来设置列表的名称

选项1 - setNames

# Option 1 - using setNames
listz <- setNames(list(data.frame("id" = 1:3, "hat" = 1:3),
           data.frame("id" = 4:6, "hat" = 4:6)), listzNames)
Run Code Online (Sandbox Code Playgroud)

选项2 - 你去的名字

# Option 2 - naming the list as you go
listz <- list(frame1 = data.frame("id" = 1:3, "hat" = 1:3),
           frame2 = data.frame("id" = 4:6, "hat" = 4:6))
Run Code Online (Sandbox Code Playgroud)

选项3 - Hmiscllist

# If your data.frames already exist
# use the llist function in Hmisc, which names the list
# using the names of the object in each element
library(Hmisc)
frame1 <- data.frame("id" = 1:3, "hat" = 1:3)
frame2 <- data.frame("id" = 4:6, "hat" = 4:6)

listz <- llist(frame1,frame2)
Run Code Online (Sandbox Code Playgroud)

选项4 - 使用setNames和get来存在

# if your data.frames already exist in the global environment then
# you can use
listz <- setNames(lapply(listzNames, get),listzNames)
Run Code Online (Sandbox Code Playgroud)

选项5初始化列表(我不喜欢这个)

listz <- vector("list",2)
names(listz) <- listzNames
listz[[1]] <- data.frame("id" = 1:3, "hat" = 1:3)
listz[[2]] <- data.frame("id" = 4:6, "hat" = 4:6)
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个选项,它需要更多的打字,因此更有可能出错!

请注意 lapply

lapply 将保留任何名称

lapply(listz,head,n=1)

#$frame1
#  id hat
#1  1   1
#
#$frame2
#  id hat
#1  4   4
Run Code Online (Sandbox Code Playgroud)