在应用结果上设置名称

时间:2018-04-01 12:52:10

标签: r apply named

我正在将函数应用到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

我怎样才能做到这一点?

4 个答案:

答案 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