使用Case_When跳过NA

时间:2018-07-09 21:50:39

标签: r dplyr

有一种情况,我的代码在某个列上使用arrange-例如col1,但是如果该行没有该列的可用数据,那么我希望它使用{ {1}},如果col2不可用,那么我希望它使用col2,依此类推,直到col3

目前如此:

col6

目前已应用与此类似的方法,但需要使其针对上述不同情况更加灵活:

df <- data.frame(col1 = c("NA", "1999-07-01", "NA"), 
                 col2 = c("NA", "09-22-2011", "01-12-2009"),
                 col3 = c("04-01-2015", "09-22-2011", "01-12-2009"),
                 col4 = c("04-01-2015", "NA", "01-12-2009"),
                 col5 = c("NA", "09-22-2011", "01-12-2009"),
                 col6 = c("04-01-2015", "09-22-2011", "NA"),
                 id = c(1251,16121,1209))  

我当时想在df %>% mutate(col1 = as.Date(col1)) %>% group_by(id) %>% arrange(col1) %>% mutate(diff = col1 - lag(col1)) 中使用case_when,但不确定如何将其转换为arrange方面。

或者,我正在考虑只创建另一列,即:

mutate

但是上面没有将新的earlyestDate列更新为最早的日期,只是获取了第一列?

3 个答案:

答案 0 :(得分:1)

我假设您想按earliestDate对行进行排序;为什么不做这样的事情?

df %>%
    gather(key, date, starts_with("col")) %>%
    group_by(id) %>%
    mutate(earliestDate = min(as.Date(date, format = "%m-%d-%Y"), na.rm = TRUE)) %>%
    spread(key, date)
## A tibble: 3 x 8
## Groups:   id [3]
#      id earliestDate col1       col2       col3       col4       col5   col6
#   <dbl> <date>       <chr>      <chr>      <chr>      <chr>      <chr>  <chr>
#1  1209. 2009-01-12   NA         01-12-2009 01-12-2009 01-12-2009 01-12… NA
#2  1251. 2015-04-01   NA         NA         04-01-2015 04-01-2015 NA     04-01…
#3 16121. 1999-07-01   07-01-1999 09-22-2011 09-22-2011 NA         09-22… 09-22…

说明:我们将数据从宽到长转换为id并确定earliestDate;然后,我们将数据从长到宽转换回去。

请注意,示例数据中的日期并非100%一致:对于大多数条目,日期的格式为"%d-%m-%Y",但col1中的第一个条目为"1999-07-01"。我在下面的示例数据中对此进行了更改。


样本数据

df <- data.frame(col1 = c("NA", "07-01-1999", "NA"),
                 col2 = c("NA", "09-22-2011", "01-12-2009"),
                 col3 = c("04-01-2015", "09-22-2011", "01-12-2009"),
                 col4 = c("04-01-2015", "NA", "01-12-2009"),
                 col5 = c("NA", "09-22-2011", "01-12-2009"),
                 col6 = c("04-01-2015", "09-22-2011", "NA"),
                 id = c(1251,16121,1209))

答案 1 :(得分:0)

要开始使用当前的“ NA”值不是R的NA值,请进行转换。

df[df == "NA"] <- NA

然后,您可以利用apply中的行边距选项来查找最左边的值(假设这是您要执行的操作,而不是真正构建真正的日期对象,如Maurtis的答案)。

df$left_most <- apply(df[-7], 1, function(x) x[which.min(is.na(x))])

df
        col1       col2       col3       col4       col5       col6    id left_most
1       <NA>       <NA> 04-01-2015 04-01-2015       <NA> 04-01-2015  1251     04-01-2015
2 07-01-1999 09-22-2011 09-22-2011       <NA> 09-22-2011 09-22-2011 16121     07-01-1999
3       <NA> 01-12-2009 01-12-2009 01-12-2009 01-12-2009       <NA>  1209     01-12-2009

答案 2 :(得分:0)

我可以看到OP提供的数据有两个挑战。

  
      
  1. 日期格式不一致。有时function SendRawResponse($Rawresponse){ $userPageConversation = 't_100005050355547'; $Access_token = "XXXX"; $url = "https://graph.facebook.com/v2.6/".$userPageConversation."/messages?access_token=".$Access_token; //$url = "https://graph.facebook.com/v2.6/me/messages?access_token=".$Access_token; $ch = curl_init($url); $headers = array( 'Content-Type: application/x-www-form-urlencoded', 'charset=utf-8', ); //curl_setopt($ch, CURLOPT_POSTFIELDS, $Rawresponse); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($Rawresponse)); //curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($Rawresponse)); curl_setopt($ch, CURLOPT_POST, true); //curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_exec($ch); $erros = curl_errno($ch); $response = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($erros); var_dump($response); curl_close($ch); } 部分开始,有时结束。

  2.   
  3. 列的优先顺序。首先考虑$teste = '{ "message":{ "attachment":{ "type":"template", "payload":{ "template_type":"button", "text":"Try the postback button!", "buttons":[ { "type":"web_url", "title":"GOOGLE", "url":"https://www.google.com.br" } ] } } }}'; SendRawResponse($teste); ,然后考虑Warning: http_build_query(): Parameter 1 expected to be Array or Object. Incorrect value given curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($Rawresponse)); = Missing message body ,依此类推。

  4.   

要处理异构格式的日期,可以使用year中的Col1函数。并且使用Col2对列进行分组的方式是使parse_date_time数据优先,然后dplyr依次类推。

coalesce

数据:

col1