如何计算r

时间:2016-08-12 12:18:13

标签: r

我有一个数据框:

df = read.table(text="ID    V1
1   'TT AA TC GG' 
2   'AT GG CC TG AA' 
3   'GT AC TT AT'
4   'GC TA CT'
5   'AC'
6   'AA TT CC GG'", header=T, stringsAsFactors=F)

V1列具有不同长度的字符串,其中同位字符或异双字母由空格分隔。我想计算每一行的双字母数。 我使用strsplit(as.character(df$V1), " ")转换列表。我知道如何在单个字符串中进行,但不在列表中。例如,A=c("AA","TT","CC","AC","TC")计算sum(substr(A,1,1) != substr(A,2,2))预期结果:

df = read.table(text="ID    V1  num
1   'TT AA TC GG'   1
2   'AT GG CC TG AA'    2
3   'GT AC TT AT'   3
4   'GC TA CT'  3
5   'AC'    1
6   'AA TT CC GG'   0", header=T, stringsAsFactors=F)

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

一个选项是拆分字符串,然后使用substr分别提取第一个和第二个字符,比较它以获得逻辑向量和sum

df1$num <- vapply(strsplit(df$V1, "\\s+"), function(x)
                        sum(substr(x,1,1)!= substr(x,2,2)), 0)
df1$num
#[1] 1 2 3 3 1 0

或者紧凑的选项是在用\\w+

删除所有同源子串后用str_count计算单词(gsub
library(stringr)
str_count(trimws(gsub("(\\S)\\1+", "", df$V1)), "\\w+")
#[1] 1 2 3 3 1 0

它也适用于领先/滞后空间

str_count(gsub("(\\S)\\1+", "", df$V1), "\\w+")
#[1] 1 2 3 3 1 0