![](/img/trans.png)
[英]How to get rid of data frame name in `deparse(substitute())`?
[英]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.