我有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等)。
答案 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
每行中的值,您可以从上面的res
或v.m.two
开始计算。在第一个选项中,我们计算NAs
每行res
的数量,然后乘以v.m.two
的第一列是0
得出的逻辑索引或不。 TRUE
值!=0
将获得count
,FALSE
将强制转换为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
即倍增,也可以使用arithmetic
。 ifelse
可以基于regex
或digits
。如果您使用的是,
,请务必添加,
。
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
中的gsub
和nchar
。
base R
(v.m.two[,1]!=0) *( nchar(gsub("[^,]", "", v.m.two[,1]))+1)
#[1] 2 2 0 2 1 3