我有一个以下类型的数据框:
我需要创建一个单独的列,其中包含以V9
列开头的每一行的最后一个变量,即15:32
,13:44
,16:37
,{{ 1}},15:31
,NULL
,NULL
,16:10
等。如果更容易,我可以继续删除空行(在本例中为5和6) 。
我尝试了16:22
,which.max
和length
的组合,但输出没有意义。所以我不知道接下来该做什么。谢谢你的帮助。
答案 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();