根据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。
答案 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;