在NA中使用mutate和last函数

时间:2016-07-25 04:10:08

标签: r dplyr

根据last包中的dplyr函数,如果您想获取向量中的最后一个元素(NA除外),您只需引入na.omit即可。

library(dplyr)
x <- c(1:10,NA)
last(x)
# [1] NA
last(na.omit(x))
# [1] 10

我想为每个var1计算id的最后一个元素。以下是使用的数据框的示例。

id<-rep(c(1,2,3),c(3,2,2))
var1<-c(5,1,4,2,NA,NA,NA)
df<-data.frame(id,var1)
df
#   id var1
# 1  1    5
# 2  1    1
# 3  1    4
# 4  2    2
# 5  2   NA
# 6  3   NA
# 7  3   NA

请注意,id=1仅包含var1的数字,id=2包含一个数字和一个NA,而id=3仅包含NA个而且没有数字。 我想获得以下内容:

df
#   id var1
# 1  1    4
# 2  1    4
# 3  1    4
# 4  2    2
# 5  2    2
# 6  3   NA
# 7  3   NA

这是我为实现我想要的目标而做的,但我收到了一个错误。

mutate(var1=ifelse(length(na.omit(var1))==0,NA,last(na.omit(var1))))
# Error: Unsupported vector type language

EDIT1 :根据评论,上面的代码适用于dplyr 0.4.3,显然不适用于dplyr 0.5.0(在我的情况下)。另外,我想使用最后一个元素而不是具有最大值的元素。因此,我更改了数据框以使其更加通用。

EDIT2 :我考虑过列出所有可能情况的数据框。三种情况,(1)所有数字,(2)数字+ NA和(3)所有NA。

3 个答案:

答案 0 :(得分:1)

我被要求解释我的解决方案,但实际上我并不完全理解为什么OP的解决方案不起作用。最初我认为这是由 final TextView textView = (TextView) findViewById(R.id.text); final CharSequence text = textView.getText(); final SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text); final URLSpan[] spans = spannableStringBuilder.getSpans(0, text.length(), URLSpan.class); final URLSpan span = spans[0]; final int start = spannableStringBuilder.getSpanStart(span); final int end = spannableStringBuilder.getSpanEnd(span); final int flags = spannableStringBuilder.getSpanFlags(span); final ClickableSpan clickableSpan = new ClickableSpan() { public void onClick(View view) { Log.d(TAG, "Clicked: " + span.getURL()); } }; spannableStringBuilder.setSpan(clickableSpan, start, end, flags); spannableStringBuilder.removeSpan(span); textView.setText(spannableStringBuilder); textView.setLinksClickable(true); textView.setMovementMethod(LinkMovementMethod.getInstance());

返回的对象类引起的
na.omit

但后来我注意到> na.omit(var1) [1] 1 2 3 4 attr(,"na.action") [1] 5 attr(,"class") [1] "omit" (我认为nth只是它的包装)工作正常:

last

另一种方法是使用df %>% group_by(id) %>% mutate(var1=nth(na.omit(var1),-1L)) 而不是tail

last

或者像我最初那样创建一个新函数:

df %>% 
group_by(id) %>% 
mutate(var1=tail(na.omit(var1),1))

我只是对性能上的任何差异感到好奇,所以我检查了它们但我会说它们是等价的

aa <- function(x) last(na.omit(x))
df %>% group_by(id) %>% mutate(var1=aa(var1))

答案 1 :(得分:0)

使用dplyr包,我们可以按每个id分组并获取每个id的最大值并替换为var1

library(dplyr)

    df <- df %>%
      group_by(id) %>%
      mutate(var1 = max(var1,na.rm=T))

    df
         id  var1
      <dbl> <int>
    1     1     3
    2     1     3
    3     1     3
    4     2     4
    5     2     4

答案 2 :(得分:0)

我有类似的问题。这对我有用:

&#xA;&#xA;
  df%&gt;%&#xA; group_by(id)%&gt;%&#xA; mutate(missing = is.na(var1))%&gt;%&#xA; mutate(var1 = ifelse(any(!missing),var1 [!missing] [length(var1 [!missing])],NA))&#xA;  
&#xA;