dplyr:substr的矢量化

时间:2016-04-17 16:31:28

标签: r dplyr

参考问题substr in dplyr %>% mutate和@akrun的答案,为什么两个创建的列给出相同的答案?

df <- data_frame(t = '1234567890ABCDEFG', a = 1:5, b = 6:10)
df %>%  mutate(u = substr(t, a,  a + b), v = substring(t, a,  a + b))

我无法理解原问题中的情况。 谢谢!

1 个答案:

答案 0 :(得分:1)

区别在于矢量化

substr("1234567890ABCDEFG", df$a, df$a+df$b)
#[1] "1234567"
substring("1234567890ABCDEFG", df$a, df$a+df$b)
#[1] "1234567"     "23456789"    "34567890A"   "4567890ABC"  "567890ABCDE"

substr只返回一个值,而substring返回的vector length等于数据集'df'中的行数。由于只有一个值输出,它将在mutate中回收。但是,如果我们使用多个值,即

substr(rep("1234567890ABCDEFG", nrow(df)), df$a, df$a+df$b)
#[1] "1234567"     "23456789"    "34567890A"   "4567890ABC"  "567890ABCDE"
substring(rep("1234567890ABCDEFG", nrow(df)), df$a, df$a+df$b)
#[1] "1234567"     "23456789"    "34567890A"   "4567890ABC"  "567890ABCDE"

然后,输出是相同的。在OP的示例中,它获得上述输出,因为x中的substrstartstop的长度相同。我们可以用

复制第一个输出
 df %>%
     mutate(u = substr("1234567890ABCDEFG", a, a+b),
            v = substring("1234567890ABCDEFG", a, a+b)) 
#                 t     a     b       u           v
#              (chr) (int) (int)   (chr)       (chr)
#1 1234567890ABCDEFG     1     6 1234567     1234567
#2 1234567890ABCDEFG     2     7 1234567    23456789
#3 1234567890ABCDEFG     3     8 1234567   34567890A
#4 1234567890ABCDEFG     4     9 1234567  4567890ABC
#5 1234567890ABCDEFG     5    10 1234567 567890ABCDE