我正在将函数应用到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
我怎样才能做到这一点?
答案 0 :(得分:3)
你可以这样做:
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
从您list
MARGIN
的相应data.frame
的dimnames中取出MARGIN=1
个名称(在您的情况下为list
,所以{{1}名称将对应于rownames)。
答案 1 :(得分:2)
或在致电申请后使用setNames()
:
setNames(apply(df, 1, function(x) {
data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2]))
}), df$C)
答案 2 :(得分:1)
如果输出应该是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
答案 3 :(得分:0)
您不需要apply
- 功能。你可以这样做:
setNames(as.list(df[[1]] * df[[2]]), df[[3]])
结果:
$A
[1] 9
$Z
[1] 10
$E
[1] 21