需要删除包含" 0"在R中保留其他细胞

时间:2016-11-04 22:39:30

标签: r dplyr reshape2

我的数据框包含" 0"细胞中的值。我需要调出值(字母/非零的)和相应的票号。数据框(m)看起来像:(请注意:列名与其值类似)

       a1   b1  c1  d1  e1  f1  g1  h1  i1  j1  k1  l1
TKT1   a1   b1  0   d1  0   0   0   h1  0   0   k1  0
TKT2   0    b1  0   0   e1  0   g1  h1  0   j1  k1  0
TKT3   a1   0   0   d1  e1  0   g1  h1  i1  0   k1  l1

生成数据集的代码:

#sample data
m <- matrix(sample(0:1, 12*3, replace=T), ncol=12)
colnames(m) <- c("a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1", "i1", "j1", "k1", "l1")
rownames(m) <- c("TKT1","TKT2","TKT3")

#replacement
ones <- which(m==1, arr.ind=T)
m[ones]<-colnames(m)[ones[,2]]
m <- as.data.frame(m)

我想要的输出格式是:

Tickets Values
  TKT1  a1
  TKT1  b1
  TKT1  d1
  TKT1  h1
  TKT1  k1
  TKT2  b1
  TKT2  e1
  TKT2  g1
  TKT2  h1
  TKT2  j1
  TKT2  k1
  TKT3  a1
  TKT3  d1
  TKT3  e1
  TKT3  g1
  TKT3  h1
  TKT3  i1
  TKT3  k1
  TKT3  l1

我想到的一种方法是删除数据框中的单元格(如果它们包含0),然后向左移动所有数据。我不知道该怎么办。

4 个答案:

答案 0 :(得分:8)

这可以在基线r中用一行完成:

setNames(expand.grid(dimnames(m))[m != "0",], c("Tickets", "Values"))

expand.grid给出行名和列名的所有组合,然后m != "0"选择非零的条目。 setNames为列命名。

答案 1 :(得分:3)

虽然没有用于随机生成data.frame的set.seed,但结果会略有不同:

library(dplyr); library(reshape2)
m %>% add_rownames('Tickets') %>% melt(id.var="Tickets") %>% filter(value!=0) %>% select(-variable) %>% arrange(Tickets)

这给出了预期的结果。

答案 2 :(得分:0)

library(tidyverse)单管解决方案:

dfLong <- 
    m %>% 
    rownames_to_column("Tickets") %>% # newly refactored dplyr function
    gather(Keys, Values, a1:l1) %>% # tidyr:: gather all columns into key, value pairs
    filter(Values == Keys) %>% # select the matched cells
    select(-Keys) %>% # remove superfluous column
    arrange(Tickets, Values) # order correctly for desired output

答案 3 :(得分:0)

使用library(data.table)还有一个班轮:

melt(setDT(m, keep.rownames = "Tickets"), id.vars = "Tickets")[, variable := NULL][value != "0"]

使用melt类似于@agenis的答案。