在子集中检索名称(表),其中只有1个观察

时间:2016-07-01 02:21:39

标签: r

我的问题是,当我在对表进行子集化后尝试检索names(myresults)时,当返回的子集只有1个结果时,我得到null。不是返回行名称的字符向量,而是返回一个整数(在这种情况下为1)。

这是一张表

head(tbl)
               1 2 3 4 5 6
      afford   0 1 0 0 0 0
      app      0 0 0 1 0 0
      back     0 1 0 0 0 0
      cancel   0 0 0 0 1 0
      charg    0 0 0 0 0 1
      download 0 0 0 0 0 1

我在循环中对表进行了子集化以返回每个组的表。如果术语属于某个组,则其值为1:

for (i in 1:ncol(tbl)) {
  t <- tbl[which(tbl[,i]==1),i]
  nam <- names(t)
  df <- as.data.frame(nam)
  names(df) <- paste0("Cluster ",i)
  print(kable(df))
}

which()返回的术语有多个实例时,此循环似乎正常。但是第4组只有1个术语&#34; app&#34;给了我一些问题。这是第3组的一个例子,它按预期工作,然后在第4组,但不是:

> t <- tbl[which(tbl[,4]==1),4] # only 1 observation meets this criteria
> t
[1] 1
> t <- tbl[which(tbl[,3]==1),3] # 3 observations meet this criteria
> t
aword    cat    dog 
      1       1       1 

所以我可以names(t)获得tbl[,3],其中有3个返回的实例,但tbl[,4]只有1个。

> t <- fintab[which(fintab[,4]==1),4]
> names(t)
NULL # expected "app"

> t <- fintab[which(fintab[,4]==1),4]
> names(t)
[1] "aword" "cat"    "dog"

如果我在示例中只返回了1个实例,那么如何获取名称(t)?

以下评论后面的一些进一步背景:

> str(tbl)
 'table' int [1:33, 1:6] 0 0 0 0 0 0 0 0 0 0 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:33] "aword" "app" "cat" "dog" ...
  ..$ : chr [1:6] "1" "2" "3" "4" ...
> 

> dput(tbl)
structure(c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
1L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), .Dim = c(33L, 6L), .Dimnames = structure(list(
    c("aword", "app", "back", "cancel", "charg", "download", 
    "enough", "expens", "get", "great", "just", "like", "love", 
    "cat", "dog", "bla", "month", "much", "need", 
    "never", "phone", "pleas", "blabla", "realli", "term", "sign", 
    "thank", "time", "triangle", "use", "want", "will", "work"), c("1", 
    "2", "3", "4", "5", "6")), .Names = c("", "")), class = "table")

1 个答案:

答案 0 :(得分:2)

由于我们正在对单个列进行子集化,因此我们得到逻辑索引(tbl[,4] ==1 - 除非有NA,否则无需用which换行。在这种情况下,which删除那些NAs)并使用它来对列向量进行子集化。

tbl[,4][tbl[,4]==1]
#  app 
#  1 

tbl[,3][tbl[,3]==1]
#   cat blabla   time 
#     1      1      1