如何将DataFrame的C列设为apply函数返回列表的名称?
给apply返回的列表添加自定义名称的几种方法
刚好碰到过类似需求,其实不用纠结apply没有USE.NAME参数,咱们可以用几种简单方式实现用C列作为列表名称的效果,给你列几个实用方案:
方法1:手动给列表命名(最直接,无需额外包)
先正常用apply生成结果,再用names()函数把df的C列赋值给列表的名称就行:
df = data.frame(A=c(1,2,3), B=c(9,5,7), C=c("A", "Z", "E")) # 生成无名称的结果列表 result <- apply(df, 1, function(x){ data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2])) }) # 给列表设置名称 names(result) <- df$C
执行后你再查看result,每个元素就会以C列的"A"、"Z"、"E"作为名称了。
方法2:用tidyverse工具链(适合习惯purrr的用户)
如果你平时用tidyverse,可以用purrr::set_names()来链式处理,代码更简洁:
library(purrr) df = data.frame(A=c(1,2,3), B=c(9,5,7), C=c("A", "Z", "E")) result <- df %>% apply(1, function(x){ data.frame(xxx=as.numeric(x[1]) * as.numeric(x[2])) }) %>% set_names(df$C)
方法3:换用by()函数(一步到位生成带名称的列表)
如果你的逻辑允许按C列分组处理,by()函数会自动用分组变量作为列表名称,省去额外命名步骤:
df = data.frame(A=c(1,2,3), B=c(9,5,7), C=c("A", "Z", "E")) result <- by(df, df$C, function(x){ data.frame(xxx = x$A * x$B) })
注意:这个方法要求C列的每个值都是唯一的,否则相同名称的行会被合并处理,刚好你的示例数据符合这个条件。
不管用哪种方法,最终得到的result都会是你想要的带名称的列表,比如:
> result $A xxx 1 9 $Z xxx 1 10 $E xxx 1 21
内容的提问来源于stack exchange,提问作者Dan Chaltiel
相关产品推荐
相关产品推荐

