如何在数据框中选择行的最后一个值并将它们排列在一个单独的列中?

时间:2015-07-14 09:57:45

标签: r

我有一个以下类型的数据框:

enter image description here

我需要创建一个单独的列,其中包含以V9列开头的每一行的最后一个变量,即15:3213:4416:37,{{ 1}},15:31NULLNULL16:10等。如果更容易,我可以继续删除空行(在本例中为5和6) 。 我尝试了16:22which.maxlength的组合,但输出没有意义。所以我不知道接下来该做什么。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

我们可以使用max.col。列子列' V9'到' V11'。然后,使用max.col获取非空元素的列索引。如果是' tie',在' max.col'中有一个可选参数。即ties.method指定' first',' last'或者'随机'。默认选项为' random'。在这里,我正在使用' last'作为选择。然后,我们cbind的序列为' row'创建' row / column'索引并从' dfN'中提取值。

dfN <- df1[paste0('V', 9:11)]
new <- dfN[cbind(1:nrow(dfN),max.col(dfN!='', 'last'))]
new  
#[1] "15:32" "13:44" "16:37" "15:31" ""      ""      "16:10" "16:22" "16:21"
#[10] "15:34" "16:26"

cbind(dfN, new)
#     V9   V10   V11   new
#1  15:32             15:32
#2        13:44       13:44
#3  16:37             16:37
#4  15:31             15:31
#5                         
#6                         
#7  12:07 12:32 16:10 16:10
#8  12:09 12:36 16:22 16:22
#9  12:06 12:35 16:21 16:21
#10 12:08 12:26 15:34 15:34
#11 12:35 13:00 16:26 16:26

或者我们可以使用apply

apply(dfN, 1, function(x) if(any(x!='')) tail(x[x!=''],1) else '')
#[1] "15:32" "13:44" "16:37" "15:31" ""      ""      "16:10" "16:22" "16:21"
#[10] "15:34" "16:26"

答案 1 :(得分:0)

这不优雅,但应该有效:

a <- seq(7)
b <- c(1, NA, 1, NA, 2, NA, 2)
c <- c(2, 3, NA, NA, 4, NA, NA)
df <- data.frame(rbind(a, b, c))

对于每一行,您将其转置为一列,省略缺失值,反转它,然后返回第一个值。

我用它来测试数据:

> unlist(output)
[1] 7 2 4

以下是该流程的输出:

getFragmentManager().beginTransaction().replace(R.id.container,new MyFragment()).addToBackStack("mytag").commit();