我已经阅读了许多关于如何从字符串创建对象或使用assign()
、或评估表达式的主题get()
,但有些事情对我来说并不完全清楚。as.name()
eval(substitute())
在下面的示例中,我有一个输入数据集(长格式),我想要输出 3 个矩阵。
输入数据框:
# Input dataframe
df <- data.frame(v1 = c(rep("A", 3), rep("B", 3)),
v2 = c(rep(letters[1:3], 2)),
dfA = sample(1:10, 6),
dfB = sample(1:10, 6),
dfC = sample(1:10, 6))
> df
v1 v2 dfA dfB dfC
1 A a 5 10 5
2 A b 4 7 9
3 A c 10 1 2
4 B a 7 9 7
5 B b 2 8 1
6 B c 9 3 4
3 个变量的前缀是数据集名称(然后是“A”、“B”、“C”)。
当v2
作为键传播时,我想要 3 个矩阵,分别为dfA
,dfB
和dfC
值。矩阵名称也将具有扩展值的名称。行名将是v1
值。
我想要的矩阵:
> dfA
a b c
A 4 1 2
B 5 8 7
> dfB
a b c
A 1 9 5
B 10 4 2
> dfC
a b c
A 5 1 3
B 6 4 9
所以,手动,没问题(我只是在这里做第一个矩阵):
library(dplyr)
library(tidyr)
dfA <- df %>% select(v1, v2, dfA) %>% spread(key = v2, value = dfA)
row.names(dfA) <- dfA[, 1]
dfA <- dfA %>% select(-1) %>% as.matrix()
> dfA
a b c
A 4 1 2
B 5 8 7
但是现在,我在输入中有很多数据框,所以我想自动完成。我将使用 DF 名称作为参数执行一个函数,但现在我想逐步向您展示不使用函数的方法。
dfName = "df"
# For : dfA <- df %>% select(v1, v2, dfA) :
assign(paste0(dfName, "A"), get(dfName) %>% select(v1, v2, get(paste0(dfName, "A"))))
> dfA
v1 v2 dfA
1 A a 5
2 A b 4
3 A c 10
4 B a 7
5 B b 2
6 B c 9
# For : dfA <- dfA %>% spread(key = v2, value = dfA)
assign(paste0(dfName, "A"), get(paste0(dfName, "A")) %>%
spread(key = v2, value = get(paste0(dfName, "A"))))
Error: Invalid column specification
在那里,我对扩展函数有一个错误。它在select()
上面起作用,但在 spread() 中不起作用……我应该怎么做?
好吧,我设法做到这一点的唯一方法是:
eval(substitute(var1 <- var1 %>% spread(key = v2, value = var1),
list(var1 = as.name(paste0(dfName, "A")))))
> dfA
v1 a b c
1 A 5 4 10
2 B 7 2 9
然后,我想将 v1 值放入 row.names :
row.names(get(paste0(dfName, "A"))) <- get(paste0(dfName, "A"))[, 1]
...错误(我不明白):
Error in ... could not find function "get<-"
但我设法做到了:
eval(substitute(row.names(var1) <- var1[, 1],
list(var1 = as.name(paste0(dfName, "A")))))
> dfA
v1 a b c
A A 5 4 10
B B 7 2 9
最后使它成为一个矩阵:
assign(paste0(dfName, "A"), get(paste0(dfName, "A")) %>% select(-1) %>% as.matrix())
> dfA
a b c
A 5 4 10
B 7 2 9
所以,我可以让它工作,但它对我来说并不“漂亮”......
有太多assign()
或太多eval(substitute())
吗?这是这样做的好方法吗?
我想我几乎把手指放在了上面,但我仍然不明白我可能遇到的错误。
我错过了什么吗?有没有更好的方法呢?(更好,我的意思是清晰的编码,更好的效率,尊重R编码规则......)
非常感谢您的回答,很抱歉这篇长文!