如何通过数据框名称更改列表中数据框中列的名称?
How to change names of columns in data frames which are in list, by data frame name?
我在更改列表中数据框列的名称时遇到问题 - 我有 df 列表,其中 行数不同 但我认为这在我想做的事。我想通过向它们添加数据框的名称来更改指定列的名称,好吧,这就是我想要获得的:
1.让我们创建一些假数据:
a <- c(1,2,3,4)
b <- runif(4)
c <- runif(4)
d <- runif(4)
df1 <- data.frame(a,b,c,d)
df2 <- data.frame(a,b,c,d)
df3 <- data.frame(a,b,c,d)
my_list <- list(df1=df1, df2=df2)
我创建了这些向量三次(在创建 df 之前)以获得不同的值,因此我有:
$df1
a b c d
1 1 0.6351811 0.51084221 0.038293376
2 2 0.9841223 0.15052422 0.877096060
3 3 0.3502053 0.01400321 0.231091711
4 4 0.8116008 0.46730937 0.006989978
$df2
a b c d
1 1 0.08205446 0.9186334 0.3346115
2 2 0.39882413 0.9171668 0.7663191
3 3 0.93652356 0.5607171 0.5846735
4 4 0.62940152 0.6683307 0.1347783
$df3
a b c d
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
现在我想要得到的是:
> my_list
$df1
a b_df1 c_df1 d_df1
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df2
a b_df2 c_df2 d_df2
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df3
a b_df3 c_df3 d_df3
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
到目前为止我做了什么?
当然我可以这样做:
colnames(my_list[[1]]) <- c('a', paste(colnames(my_list[[1]])[2:4],'_','df1', sep=''))
colnames(my_list[[2]]) <- c('a', paste(colnames(my_list[[2]])[2:4],'_','df2', sep=''))
colnames(my_list[[3]]) <- c('a', paste(colnames(my_list[[3]])[2:4],'_','df3', sep=''))
但我想使用 lapply()
因为我的数据是一个列表,里面有很多数据框所以我做了类似的东西:
tmp <- names(my_list)
lapply(tmp, function(x) colnames(my_list[[x]]) <- c('GENE_SYMBOL', paste(colnames(my_list[[x]])[2:4],'_',x, sep='')))
不幸的是结果是:
[[1]]
[1] "GENE_SYMBOL" "b_df1" "c_df1" "d_df1"
[[2]]
[1] "GENE_SYMBOL" "b_df2" "c_df2" "d_df2"
[[3]]
[1] "GENE_SYMBOL" "b_df3" "c_df3" "d_df3"
接近但不正确,不知道为什么:(
我认为这不是这个 的副本,因为这里我的 colnames 是基于数据框的名称...
我说过我想使用 lapply()
但是...
tmp <- names(my_list)
for (i in seq_along(my_list)){
colnames(my_list[[i]]) <- c('GENE_SYMBOL', paste(colnames(my_list[[i]])[2:4],'_',tmp[i], sep=''))
}
my_list
>my_list
$df1
GENE_SYMBOL b_df1 c_df1 d_df1
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df2
GENE_SYMBOL b_df2 c_df2 d_df2
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df3
GENE_SYMBOL b_df3 c_df3 d_df3
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
谢谢...
你快完成了!
只需将循环转换为 lapply 即可:
lapply(seq_along(my_list), function(i)
colnames(my_list[[i]]) <-
c('GENE_SYMBOL', paste0(colnames(my_list[[i]])[2:4], '_', tmp[i])))
并使用 paste0 因为你不需要分隔符。
我在更改列表中数据框列的名称时遇到问题 - 我有 df 列表,其中 行数不同 但我认为这在我想做的事。我想通过向它们添加数据框的名称来更改指定列的名称,好吧,这就是我想要获得的:
1.让我们创建一些假数据:
a <- c(1,2,3,4)
b <- runif(4)
c <- runif(4)
d <- runif(4)
df1 <- data.frame(a,b,c,d)
df2 <- data.frame(a,b,c,d)
df3 <- data.frame(a,b,c,d)
my_list <- list(df1=df1, df2=df2)
我创建了这些向量三次(在创建 df 之前)以获得不同的值,因此我有:
$df1
a b c d
1 1 0.6351811 0.51084221 0.038293376
2 2 0.9841223 0.15052422 0.877096060
3 3 0.3502053 0.01400321 0.231091711
4 4 0.8116008 0.46730937 0.006989978
$df2
a b c d
1 1 0.08205446 0.9186334 0.3346115
2 2 0.39882413 0.9171668 0.7663191
3 3 0.93652356 0.5607171 0.5846735
4 4 0.62940152 0.6683307 0.1347783
$df3
a b c d
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
现在我想要得到的是:
> my_list
$df1
a b_df1 c_df1 d_df1
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df2
a b_df2 c_df2 d_df2
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df3
a b_df3 c_df3 d_df3
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
到目前为止我做了什么?
当然我可以这样做:
colnames(my_list[[1]]) <- c('a', paste(colnames(my_list[[1]])[2:4],'_','df1', sep=''))
colnames(my_list[[2]]) <- c('a', paste(colnames(my_list[[2]])[2:4],'_','df2', sep=''))
colnames(my_list[[3]]) <- c('a', paste(colnames(my_list[[3]])[2:4],'_','df3', sep=''))
但我想使用 lapply()
因为我的数据是一个列表,里面有很多数据框所以我做了类似的东西:
tmp <- names(my_list)
lapply(tmp, function(x) colnames(my_list[[x]]) <- c('GENE_SYMBOL', paste(colnames(my_list[[x]])[2:4],'_',x, sep='')))
不幸的是结果是:
[[1]]
[1] "GENE_SYMBOL" "b_df1" "c_df1" "d_df1"
[[2]]
[1] "GENE_SYMBOL" "b_df2" "c_df2" "d_df2"
[[3]]
[1] "GENE_SYMBOL" "b_df3" "c_df3" "d_df3"
接近但不正确,不知道为什么:(
我认为这不是这个
我说过我想使用 lapply()
但是...
tmp <- names(my_list)
for (i in seq_along(my_list)){
colnames(my_list[[i]]) <- c('GENE_SYMBOL', paste(colnames(my_list[[i]])[2:4],'_',tmp[i], sep=''))
}
my_list
>my_list
$df1
GENE_SYMBOL b_df1 c_df1 d_df1
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df2
GENE_SYMBOL b_df2 c_df2 d_df2
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
$df3
GENE_SYMBOL b_df3 c_df3 d_df3
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277
谢谢...
你快完成了! 只需将循环转换为 lapply 即可:
lapply(seq_along(my_list), function(i)
colnames(my_list[[i]]) <-
c('GENE_SYMBOL', paste0(colnames(my_list[[i]])[2:4], '_', tmp[i])))
并使用 paste0 因为你不需要分隔符。