r - 获取每一行的最后一个非空列的值

标签 r string dplyr

取得以下样本数据:

data.frame(a_1=c("Apple","Grapes","Melon","Peach"),a_2=c("Nuts","Kiwi","Lime","Honey"),a_3=c("Plum","Apple",NA,NA),a_4=c("Cucumber",NA,NA,NA)) 

   a_1    a_2   a_3     a_4
1  Apple  Nuts  Plum    Cucumber
2 Grapes  Kiwi  Apple    <NA>
3  Melon  Lime  <NA>     <NA>
4  Peach  Honey  <NA>    <NA>

基本上我想在不是NA的每一行的最后一列上运行grep。因此,我在grep(“pattern”,x)中的x应该是:
Cucumber
Apple
Lime
Honey

我有一个整数,告诉我哪个a_N是最后一个:
numcol <- rowSums(!is.na(df[,grep("(^a_)\\d", colnames(df))])) 

到目前为止,我已经结合ave(),apply()和dplyr尝试过类似的方法:
grepl("pattern",df[,sprintf("a_%i",numcol)])

但是我不太能使它工作。请记住,我的数据集非常大,因此我希望使用矢量化解决方案或mb dplyr。
帮助将不胜感激。

/e:谢谢,这是一个非常好的解决方案。我的想法太复杂了。 (正则表达式是由于我的更具体的数据)

最佳答案

这里不需要正则表达式。只需使用apply + tail + na.omit即可:

> apply(mydf, 1, function(x) tail(na.omit(x), 1))
[1] "Cucumber" "Apple"    "Lime"     "Honey" 

我不知道这在速度方面有何不同,但是您也可以使用“data.table”和“reshape2”的组合,如下所示:
library(data.table)
library(reshape2)
na.omit(melt(as.data.table(mydf, keep.rownames = TRUE), 
             id.vars = "rn"))[, value[.N], by = rn]
#    rn       V1
# 1:  1 Cucumber
# 2:  2    Apple
# 3:  3     Lime
# 4:  4    Honey

或者,甚至更好:
melt(as.data.table(df, keep.rownames = TRUE), 
     id.vars = "rn", na.rm = TRUE)[, value[.N], by = rn]
#    rn       V1
# 1:  1 Cucumber
# 2:  2    Apple
# 3:  3     Lime
# 4:  4    Honey

这样会更快。在一个80万行的数据集上,apply花费了约50秒,而data.table方法花费了约2.5秒。

关于r - 获取每一行的最后一个非空列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25877417/

相关文章:

arrays - 更改 Julia 数组中每个元素的类型

R:如何阻止看门人中的装饰函数更改次要字符列?

r - 在特定列中与 grep 匹配的模式后过滤行

r - 如何在向量中插入元素?

c++ - 密码无法正确加密(携带太多字符)

r - 如何获取R中像素簇的大小

c++ - 混合 cin 和 getline 输入问题

regex - dplyr内的正则表达式匹配

r - 在 R 中展开几列

r - 使用 R 处理 xlsm