簡體   English   中英

使用數據框的名稱(刪除,替換和套用)重命名數據框列表中的第二列

[英]Rename the Second Column in a List of Data Frames using the Name of the Data Frame (deparse, substitute, and lapply)

樣本數據

我有一個包含兩列的數據幀列表:1.變量名,2.整數。

df3 <- df2 <- df1 <- data.frame(Variable = LETTERS[1:5], Value = sample(10:20, 5, replace = TRUE))
df.list <- list(df1 = df1, df2 = df2, df3 = df3)
df.list

# $df1
#     Variable Value
# 1        A    17
# 2        B    16
# 3        C    16
# 4        D    18
# 5        E    10
#
# $df2
#     Variable Value
# 1        A    17
# ...

我想做的事

列表中的每個數據框都被命名。 我想提取數據框的名稱,並使用它來重命名該數據框的第二列:

# $df1
#     Variable df1
# 1        A    17
# 2        B    16
# 3        C    16
# 4        D    18
# 5        E    10
#
# $df2
#     Variable df2
# 1        A    17
# ... 

我嘗試過的

我編寫了一個函數來使用deparse(substitute()和通過sub()正則表達式模式匹配:

mod.name <- function(x) {
    nx <- deparse(substitute(x))
    ny <- sub(".*\\$", "", nx)
    names(x)[2] <- ny
    x
}

在列表中的單個數據幀上進行測試時,它可以工作:

mod.name(df.list$df3)
df.list$df3

# Variable df3
# 1  A     17
# 2  B     16
# 3  C     16
# 4  D     18
# 5  E     10

但是,當使用lapply對列表中的所有數據幀執行此操作時,它不會:

lapply(df.list, mod.name)
df.list

# $df1
#    Variable  X[[i]]
# 1        A     17
# 2        B     16
# 3        C     16
# 4        D     18
# 5        E     10
#
# $df2
#    Variable  X[[i]]
# 1        A    17
# ...

當然,之前在StackOverflow上討論了將deparse(substitute()lapply() deparse(substitute()一起使用的問題,但是我在這里這里這里找不到任何解決方案來為我工作。

您不需要deparse(substitute(.))

nms <- setNames(, names(df.list))
df.list2 <- lapply(nms, function(x){
        names(df.list[[x]])[2] <- x
        df.list[[x]]
    })
df.list2

編輯
按照弗蘭克在下面的評論中的建議,我將nms <- names(df.list)更改為nms <- names(df.list) nms <- setNames(, names(df.list)) ,並將輸出列表的名稱更改為df.list2

從技術上講,這適用於既定目標:

Map(function(x,y){ names(y)[[2]] <- x; y }, names(df.list), df.list)

OP表示,他們的最終目標是將各列cbind在一起(大概是因為所有表中的Variable列都是相同的),因此這里有一些其他想法。

rbind和重塑。 到那里,如果所有變量都屬於同一類型(例如,整數或浮點數),我將以長格式存儲數據:

library(data.table)
DT = rbindlist(df.list, id = "src")

    src Variable Value
 1: df1        A    17
 2: df1        B    11
 3: df1        C    20
 4: df1        D    10
 5: df1        E    19
 6: df2        A    17
 7: df2        B    11
 8: df2        C    20
 9: df2        D    10
10: df2        E    19
11: df3        A    17
12: df3        B    11
13: df3        C    20
14: df3        D    10
15: df3        E    19

從那里,您可以使用

dcast(DT, Variable ~ src)

   Variable df1 df2 df3
1:        A  17  17  17
2:        B  11  11  11
3:        C  20  20  20
4:        D  10  10  10
5:        E  19  19  19

cbind 如果列的類型不同,則可以將它們與

as.data.table(c(df.list[[1]][1], lapply(df.list, `[`, -1)))

   Variable df1.Value df2.Value df3.Value
1:        A        17        17        17
2:        B        11        11        11
3:        C        20        20        20
4:        D        10        10        10
5:        E        19        19        19

如果您使用這樣的setnames則可以使用setnames之后更改列名稱。


OP在評論中提到了這兩個想法。 我只是在說明代碼細節。

無論哪種方式,我都認為堅持一張桌子會更容易進行以后的分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM