评估R中每个因子的行

时间:2014-11-02 07:18:39

标签: r

我有1000行和848级别的因子(即某些行为空)。对于每一行,我想计算元素的数量(即,一个元素= 1,2元素= 2,空行= 0等)。描述它的一种更简单的方法是:我想将一个因子转换为data.frame,但我想将数据类型从因子更改为数字并保留每行中的值。

v.m.two <- Output[,1]
v.m.two <- data.frame(v.m.two)
class(v.m.two)
[1] data.frame
class(v.m.two[1,]
[1] factor
dim(v.m.two)
[1] 1000 1
v.m.two[1,]
[1] 848 Levels: 0 1000 1002, 4875, 4082, 1952 1015, 2570, 3524 1017 1020, 1576 ... 983, 4381,
2256, 4361, 4271

有什么建议吗?

           v.m.two
1       2633, 4868
2        126, 4860
3                0
4        122, 4762
5             4256
6 2933, 2892, 2389

基本上,我想计算每一行的值(例如,第1行是2,第2行是2,第3行是0等)。

2 个答案:

答案 0 :(得分:1)

你有错误的逗号导致这些因素。试试scan

scan(text=with(v.m.two, levels(v.m.two)[v.m.two]), sep=",", what=integer())
# Read 11 items
# [1] 2633 4868  126 4860    0  122 4762 4256 2933 2892 2389

要计算长度并转换为数字,您还可以使用strsplit

s <- strsplit(as.character(v.m.two[[1]]), ", ")
vapply(s, length, integer(1L)) ## row 3 is actually 1 if there's a zero there
# [1] 2 2 1 2 1 3
as.numeric(do.call(c, s))
# [1] 2633 4868  126 4860    0  122 4762 4256 2933 2892 2389

答案 1 :(得分:0)

1将因子转换为数字

  • 如果您想将factor列转换为numeric,并希望根据每行中元素的数量设置单独的列。

     library(splitstackshape)
     res <- cSplit(v.m.two, 'v.m.two', sep=",")
     res
     #    v.m.two_1 v.m.two_2 v.m.two_3
     #1:      2633      4868        NA
     #2:       126      4860        NA
     #3:         0        NA        NA
     #4:       122      4762        NA
     #5:      4256        NA        NA
     #6:      2933      2892      2389
    
      str(res)
      #Classes ‘data.table’ and 'data.frame':   6 obs. of  3 variables:
      #$ v.m.two_1: int  2633 126 0 122 4256 2933
      # $ v.m.two_2: int  4868 4860 NA 4762 NA 2892
      #$ v.m.two_3: int  NA NA NA NA NA 2389
    
  • 如果您需要vector,可以使用stri_split中的stringi

      library(stringi)
      as.numeric(unlist(stri_split(v.m.two[,1], regex=",")))
      #[1] 2633 4868  126 4860    0  122 4762 4256 2933 2892 2389
    

<强> 2。计算行中的值

  • 要计算v.m.two每行中的值,您可以从上面的resv.m.two开始计算。在第一个选项中,我们计算NAs每行res的数量,然后乘以v.m.two的第一列是0得出的逻辑索引或不。 TRUE!=0将获得countFALSE将强制转换为0,即。 0 * value=0

      (v.m.two[,1]!=0)*(rowSums(!is.na(res)))
      #[1] 2 2 0 2 1 3    
    
  • 您可以使用来自stri_count的{​​{1}}快速(counting occurrence of particular letter in vector of words in r)。如上所述,您可以使用stringi即倍增,也可以使用arithmeticifelse可以基于regexdigits。如果您使用的是,,请务必添加,

    1
  • 另一个计算方法是使用 ifelse(v.m.two[,1]=0, stri_count(v.m.two[,1], regex="\\d+"), 0) # [1] 2 2 0 2 1 3 #Or (v.m.two[,1]!=0) *stri_count(v.m.two[,1], regex="\\d+") #[1] 2 2 0 2 1 3 #Or (v.m.two[,1]!=0) *(stri_count(v.m.two[,1], regex=",") +1) #[1] 2 2 0 2 1 3 中的gsubnchar

    base R

数据

  (v.m.two[,1]!=0) *( nchar(gsub("[^,]", "", v.m.two[,1]))+1)
  #[1] 2 2 0 2 1 3