列表中的空行作为R中data.frame中的NA值 [英] Empty rows in list as NA values in data.frame in R

查看:83
本文介绍了列表中的空行作为R中data.frame中的NA值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据框,如下所示:

I have a dataframe as follows:

hospital <- c("PROVIDENCE ALASKA MEDICAL CENTER", "ALASKA REGIONAL HOSPITAL", "FAIRBANKS MEMORIAL HOSPITAL", 
          "CRESTWOOD MEDICAL CENTER", "BAPTIST MEDICAL CENTER EAST", "ARKANSAS HEART HOSPITAL", 
          "MEDICAL CENTER NORTH LITTLE ROCK", "CRITTENDEN MEMORIAL HOSPITAL")
state <- c("AK", "AK", "AK", "AL", "AL", "AR", "AR", "AR")
rank <- c(1,2,3,1,2,1,2,3)
df <- data.frame(hospital, state, rank)
df

                                 hospital    state     rank
    1   PROVIDENCE ALASKA MEDICAL CENTER        AK        1
    2   ALASKA REGIONAL HOSPITAL                AK        2
    3   FAIRBANKS MEMORIAL HOSPITAL             AK        3
    4   CRESTWOOD MEDICAL CENTER                AL        1
    5   BAPTIST MEDICAL CENTER EAST             AL        2
    6   ARKANSAS HEART HOSPITAL                 AR        1
    7   MEDICAL CENTER NORTH LITTLE ROCK        AR        2
    8   CRITTENDEN MEMORIAL HOSPITAL            AR        3

我想创建一个函数rankall,该函数将rank作为参数并返回每个州的该级别的医院,如果该州没有与给定级别匹配的医院,则返回NA.例如,我希望rankall(rank = 3)的输出看起来像这样:

I would like to create a function, rankall, that takes rank as an argument and returns the hospitals of that rank for each state, with NAs returned if the state does not have a hospital that matches the given rank. For example, I want output of rankall(rank=3) to look like this:

                           hospital     state 
    AK  FAIRBANKS MEMORIAL HOSPITAL        AK    
    AL                         <NA>        AL
    AR CRITTENDEN MEMORIAL HOSPITAL        AR    

我尝试过:

rankall <- function(rank) {
split_by_state <- split(df, df$state)
ranked_hospitals <- lapply(split_by_state, function (x) {
    x[(x$rank==rank), ]
})
combined_ranked_hospitals <- do.call(rbind, ranked_hospitals)
return(combined_ranked_hospitals[ ,1:2])
}

但是rankall(rank = 3)返回:

But rankall(rank=3) returns:

                                 hospital     state     
    AK       FAIRBANKS MEMORIAL HOSPITAL         AK                        
    AR       CRITTENDEN MEMORIAL HOSPITAL        AR             

这遗漏了我需要跟踪的NA值. R是否有一种方法可以将我函数内的列表对象中的空行识别为NA,而不是空行?除了lapply之外,还有其他功能对于此任务更有用吗?

This leaves out the NA values that I need to keep track of. Is there a way for R to recognize the empty rows in my list object within my function as NAs, rather than as empty rows? Is there another function besides lapply that would be more useful for this task?

[注意:此数据框来自Coursera R编程课程.这也是我关于Stackoverflow的第一篇文章,也是我第一次学习编程.感谢所有提供解决方案和建议的人,这个论坛很棒. ]

[ Note: This dataframe is from the Coursera R Programming course. This is also my first post on Stackoverflow, and my first time learning programming. Thank you to all who offered solutions and advice, this forum is fantastic. ]

推荐答案

您只需要在函数中输入in/else即可

You just need an in/else in your function:

rankall <- function(rank) {
    split_by_state <- split(df, df$state)
    ranked_hospitals <- lapply(split_by_state, function (x) {
        indx <- x$rank==rank
        if(any(indx)){
            return(x[indx, ])
        else{
            out = x[1, ]
            out$hospital = NA
            return(out)
        }
    }
}

这篇关于列表中的空行作为R中data.frame中的NA值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆