我有几个数据框,我想将每个数据框的行名设置为第一列的值,然后从数据框中删除该列。我试图以程序化的方式尝试这样做。
每个数据框如下所示:
df[1:4,1:4]
V1 V2 V3 V4
1 DDX11L1 0 0 0
2 WASH7P 0 0 0
3 FAM138A 0 0 0
4 FAM138F 0 0 0
其中V1由基因符号组成。
我希望rownames由V1中的值组成,这很容易在一个接一个的基础上执行:
rownames(df) <- df[,1]
df <- df[,-1]
我一直在努力将这种逻辑应用于循环或应用函数,但显然我还没有得到它。
答案 0 :(得分:2)
如果您有数据框df1
,df2
,...,dfn
,则可以将它们放在l
列表中,例如:
l <- list(df1, df2, df3, dfn)
# or (if they're actually named with numbers at the end)
l <- mget(paste0("df", 1:n))
...然后你可以同时处理它们:
l <- lapply(l, function(x) {
rownames(x) <- x[,1]
x[,-1]
})
如果你只有几个数据框,它可以节省输入只是定义一个处理函数,然后手工应用:
proc.df <- function(x) {
rownames(x) <- x[,1]
x[,-1]
}
df1 <- proc.df(df1)
df2 <- proc.df(df2)
# ...
答案 1 :(得分:2)
对此有很多“正确”的答案,但大多数都与此类似: Apply a function to each data frame
df1 <- data.frame(V1 = c('DDX11L1', 'WASH7P', 'FAM138A', 'FAM138F'), V2 = rep(0, 4), V3 = rep(0, 4), V4 = rep(0, 4))
df2 <- data.frame(V1 = c('a', 'b', 'c', 'd'), V2 = rep(0, 4), V3 = rep(0, 4), V4 = rep(0, 4))
dfList = list(df1, df2)
newList <- lapply(dfList, function(df) {
rownames(df) <- df[,1]
df <- df[,-1]
})