R删除列表元素的行并保留行名

Ann*_*rie 3 row r list names

我有一个带有空单元格的数据框,我将其分成一个列表:

df <- data.frame(c("q","w","","r","t","y"),c("a","b","","d","e","f"),c("x","c","v","b","","m"))
colnames(df) <- c("qwerty","abc","bnm")
rownames(df) <- c("1a","1b","1c","1d","1e","1f")
list <- lapply(df, as.data.frame)
for(i in 1:length(list)){  rownames(list[[i]]) <- rownames(df) }
Run Code Online (Sandbox Code Playgroud)

但是,当我从列表的元素之一中删除空行时,该元素的行名将被删除:

list[[1]] <- list[[1]][list[[1]] != "",]
rownames(list[[1]])
NULL
Run Code Online (Sandbox Code Playgroud)

如何防止这种情况发生?

Dav*_*urg 6

行名称被“删除”,因为您已将数据框转换为向量(按定义,它没有行名称)。

当您尝试对data.frame仅包含一列的a进行子集化时,就会发生这种情况。为了防止这种情况,请按以下方式使用drop = FALSE

lapply(list, function(x) x[x != "",, drop = FALSE])
# $qwerty
#     X[[1L]]
# 1a       q
# 1b       w
# 1d       r
# 1e       t
# 1f       y
# 
# $abc
#    X[[2L]]
# 1a       a
# 1b       b
# 1d       d
# 1e       e
# 1f       f
# 
# $bnm
#    X[[3L]]
# 1a       x
# 1b       c
# 1c       v
# 1d       b
# 1f       m
Run Code Online (Sandbox Code Playgroud)

为了说明这一点,请考虑以下示例

df <- data.frame(A = c("a", "", "b"))
(subdf <- df[df$A != "", ])
# [1] a b
# Levels:  a b
class(subdf)
# [1] "factor"
rownames(subdf)
# NULL
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见 ?"[.data.frame"

下降

符合逻辑。如果为TRUE,则结果强制为最小尺寸。默认值是如果只剩下一列就删除,而如果只剩下一行就不删除。