删除表中R为0的列

时间:2017-03-07 14:29:33

标签: r dataframe dplyr multiple-columns

我在R中有一个数据框。从这个数据框中我已经提取了一列来处理。该列有一个变量和一个频率。 E.g:

      Var1  Freq
1  1100  1697
2  1200  2551
3  1300  4064
4  1400   978
5  2100  1529
6  2200  2006
7  2300  2900
8  2400  1336
9  3100  1808
10 3200  6075

然后我对此进行了排序,以便最高5个频率显示在顶部,其余频率分组在“其他”下并将其转换为数据帧,例如:

   Var1  Freq
1  6000 23844
2  4800 23216
3  3300  8821
4  3200  6075
5  3400  4595
6 other 28737

由于我的目标是将这些数据放入饼图中以显示比例,然后使用

将数据框转换为表格
#convert dataframe into table
mytableSC <- table(expandRows(sectorcode_otherdf, "Freq"))

mytableSC给了我......

 1100  1200  1300  1400  2100  2200  2300  2400  3100  3200  3250  3300  3350  3400  3500  4600  4700  4800  4900  6000 
    0     0     0     0     0     0     0     0     0  6075     0  8821     0  4595     0     0     0 23216     0 23844 
 7000 other 
    0 28737

我想删除0 in的列,我必须使用初始数据帧中的许多其他列来执行此操作,因此我希望这是自动化的。我尝试了各种各样的东西,但似乎都没有 例如:newtable <- mytableSC[,mytableSC[1,] != 0] 返回错误代码:[.default(mytableSC,1,)中的错误:维数不正确

我可以使用newtable <- mytableSC[-c(1:9, 11, 13, 15:17, 19, 21)] 这实际上确实有效,但这将是一个漫长而乏味的过程,因为其他列有更多的变量,并且我需要花费更长的时间来计算哪些列有0。 我也尝试了其他的东西,但我不确定矩阵或数据帧的代码是否适用于这个特定的问题。 任何帮助或建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

你似乎正在以一种非常迂回的方式走这条路。要创建饼图(不打算对其进行判断调用),您可以直接使用已排序和聚合的data.frame中的值。像下面这样的东西应该这样做:

pie(mydf$Freq, labels = mydf$Var1)

如果你想要中间名为vector,你可以这样生成它:

setNames(mydf$Freq, mydf$Var1)
##  6000  4800  3300  3200  3400 other 
## 23844 23216  8821  6075  4595 28737 

如果这真的是关于从表中删除零而不是从你拥有的饼图中获取饼图,那么有几个选项可供选择。这是一些可重复的样本数据:

set.seed(1)
myvec <- factor(sample(letters[sample(26, 5)], 100, TRUE), letters)
mytab <- table(myvec)

mytab
## myvec
##  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z 
##  0  0  0  0 17  0 13  0  0 24  0  0  0 18  0  0  0  0  0  0 28  0  0  0  0  0 

mytab[mytab > 0]           # alternative of @jogo
## myvec
##  e  g  j  n  u 
## 17 13 24 18 28 

mytab[mytab != 0]          # @jogo
## myvec
##  e  g  j  n  u 
## 17 13 24 18 28 

table(droplevels(myvec))   # @alistaire
## 
##  e  g  j  n  u 
## 17 13 24 18 28