R中的apply()具有用户定义的函数

 无期的囚禁_918 发布于 2023-02-13 12:21

我有一个数据框,其中有投票和政党标签

dat <- data.frame( v1=c(25, 0, 70), 
                   v2=c(75, 100, 20), 
                   v3=c(0, 0, 10), 
                   l1=c("pA", ".", "pB"), 
                   l2=c("pB", "pC", "pC"), 
                   l3=c(".", ".", "pD") )

这样每行就是一个分析单位.只有投票方才需要考虑,此功能可以提取正面投票或相应的标签

getpos <- function(vector, vorl="v"){ # change to "l" to report labels
    vot <- vector[grep( "v", colnames(vector) )]; 
    lab <- vector[grep( "l", colnames(vector) )];
    if (vorl=="v") {vot[vot>0]} else {lab[vot>0]};
}
getpos(dat[1,])           # votes for obs 1
getpos(dat[1,], vorl="l") # labels for obs 1

我希望在数据帧dat的每一行中运行函数getpos,以便生成具有不同长度的投票/标签向量的列表.应用该函数不会返回我期望的内容:

apply(X=dat, MARGIN=1, FUN=getpos, vorl="l")

谁能发现问题?相关,这可以更有效地实现吗?

1 个回答
  • 这里发生的是数据框中的行在被提取后不再具有列名apply(但它们确实有names):

    尝试:

    getpos <- function(x, vorl="v"){ 
         vot <- x[grep( "v", names(x) )] ;  lab <- x[grep( "l", names(x) )];
         if (vorl=="v") {vot[vot>0]} else {lab[vot>0]};
     }
    
    > apply(dat, MARGIN=1, FUN=function(x2) getpos(x2, vorl="l") )
    #-------------
    [[1]]
      l1 
    "pA" 
    
    [[2]]
      l2 
    "pC" 
    
    [[3]]
      l1   l3 
    "pB" "pD" 
    

    2023-02-13 12:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有