我有一个数据框:
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)
感谢您的帮助。
答案 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