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

3

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

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) }

然而,当我从列表的一个元素中删除空行时,该元素的行名称也被删除:
list[[1]] <- list[[1]][list[[1]] != "",]
rownames(list[[1]])
NULL

我该怎样防止这种情况的发生?
1个回答

6

由于您将数据框转换为向量(根据定义,向量没有行名),因此行名被“删除”。

当您尝试对只包含一列的data.frame进行子集操作时,就会发生这种情况。 为了防止这种情况,请使用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

为了说明这一点,考虑以下例子。
df <- data.frame(A = c("a", "", "b"))
(subdf <- df[df$A != "", ])
# [1] a b
# Levels:  a b
class(subdf)
# [1] "factor"
rownames(subdf)
# NULL

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

drop

逻辑值。如果为TRUE,则结果将被强制转换为最低可能的维度。默认情况下,如果只剩下一列,则会删除,但如果只剩下一行,则不会删除。


1
我不知道关于数据框的这点,感谢您详尽的解释! - Annemarie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接