使用R修改列表中的数据框

时间:2018-11-14 21:53:37

标签: r list dataframe lapply

我想处理一堆数据框的列名和行名,例如 W1 W2 W3 在以前建立的列表中列出,例如 W 。我已经看到了很多类似的问题,但是似乎没有一个能解决我的难题:

>  W <- list(W1, W2, W3)
>  lapply(W, is.data.frame)
$W1
[1] TRUE
$W2
[1] TRUE
$W3
[1] TRUE

最终我要做的是:

>  lapply(W, function(x) rowname(x) = x[,1])
>  lapply(W, function(x) x = x[,-1])
  • 使用第一列的值为每个数据框定义行名。
  • 禁止显示第一列,

,但在两种情况下,我都获得每个数据帧第一列的内容。我缺少一些基本的东西...

2 个答案:

答案 0 :(得分:3)

只需将两个步骤合并为一个lapply。请记住,在R中,一个函数将返回它求值的最后一个内容,因此在您的第一个lapply中,它将仅返回每个data.frame的rownames,因为这是函数所做的最后一个操作。之后添加x[,-1]使其返回修改后的data.frame,减去第一列。

W1 <- data.frame(a=letters[1:3], b=1:3, c=4:6)
W2 <- data.frame(a=letters[4:5], b=4:5, c=5:6)
W3 <- data.frame(a=LETTERS[1:5], b=1:5, c=11:15)
W <- list(W1, W2, W3)

W <- lapply(W, function(x) {
    row.names(x) <- x[,1]
    x[,-1]
})

答案 1 :(得分:0)

使用 tidyverse 使用@ Taiki-Sakai的数据:

library(tidyverse)
map(W, column_to_rownames, "a") # use remove_rownames(W) if relevant
# [[1]]
#   b c
# a 1 4
# b 2 5
# c 3 6
# 
# [[2]]
#   b c
# d 4 5
# e 5 6
# 
# [[3]]
#   b  c
# A 1 11
# B 2 12
# C 3 13
# D 4 14
# E 5 15
#