在应用结果上设置名称
Set name on apply results
我正在将函数应用到 dataframe
。
但与 sapply
及其朋友不同,apply
没有任何 USE.NAME
参数来获取命名列表作为返回对象。
在此示例中,我希望 C
列是返回列表的名称:
df = data.frame(A=c(1,2,3), B=c(9,5,7), C=c("A", "Z", "E"))
apply(df, 1, function(x){
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
})
# [[1]]
# xxx
# 1 9
#
# [[2]]
# xxx
# 1 10
#
# [[3]]
# xxx
# 1 21
我怎样才能做到这一点?
或在调用申请后使用 setNames()
:
setNames(apply(df, 1, function(x) {
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
}), df$C)
你可以这样做:
apply(data.frame(df, row.names = df$C), 1, function(x){
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
})
#$A
# xxx
#1 9
#
#$Z
# xxx
#1 10
#
#$E
# xxx
#1 21
解释:apply
从 data.frame
的相应 MARGIN
的 dimnames 中选取 list
个名字(在你的例子中 MARGIN=1
,所以 list
名称将对应于行名)。
如果输出应该是list
中两列的乘积,那么可以用Reduce
来完成
lst <- as.list(Reduce(`*`, df[-3]))
names(lst) <- df[,3]
或 tidyverse
library(tidyverse)
df %>%
transmute(xxx = A * B, C) %>%
split(.$C) %>%
map(~.x %>%
select(xxx))
或 nest
df %>%
transmute(xxx = A * B, C) %>%
nest(xxx) %>%
mutate(data = set_names(data, C)) %>%
pull(data)
#$A
# xxx
#1 9
#$Z
# xxx
#2 10
#$E
# xxx
#3 21
您不需要 apply
-函数。你可以这样做:
setNames(as.list(df[[1]] * df[[2]]), df[[3]])
结果:
$A
[1] 9
$Z
[1] 10
$E
[1] 21
我正在将函数应用到 dataframe
。
但与 sapply
及其朋友不同,apply
没有任何 USE.NAME
参数来获取命名列表作为返回对象。
在此示例中,我希望 C
列是返回列表的名称:
df = data.frame(A=c(1,2,3), B=c(9,5,7), C=c("A", "Z", "E"))
apply(df, 1, function(x){
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
})
# [[1]]
# xxx
# 1 9
#
# [[2]]
# xxx
# 1 10
#
# [[3]]
# xxx
# 1 21
我怎样才能做到这一点?
或在调用申请后使用 setNames()
:
setNames(apply(df, 1, function(x) {
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
}), df$C)
你可以这样做:
apply(data.frame(df, row.names = df$C), 1, function(x){
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
})
#$A
# xxx
#1 9
#
#$Z
# xxx
#1 10
#
#$E
# xxx
#1 21
解释:apply
从 data.frame
的相应 MARGIN
的 dimnames 中选取 list
个名字(在你的例子中 MARGIN=1
,所以 list
名称将对应于行名)。
如果输出应该是list
中两列的乘积,那么可以用Reduce
lst <- as.list(Reduce(`*`, df[-3]))
names(lst) <- df[,3]
或 tidyverse
library(tidyverse)
df %>%
transmute(xxx = A * B, C) %>%
split(.$C) %>%
map(~.x %>%
select(xxx))
或 nest
df %>%
transmute(xxx = A * B, C) %>%
nest(xxx) %>%
mutate(data = set_names(data, C)) %>%
pull(data)
#$A
# xxx
#1 9
#$Z
# xxx
#2 10
#$E
# xxx
#3 21
您不需要 apply
-函数。你可以这样做:
setNames(as.list(df[[1]] * df[[2]]), df[[3]])
结果:
$A
[1] 9
$Z
[1] 10
$E
[1] 21