参考问题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))
我无法理解原问题中的情况。 谢谢!
答案 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
中的substr
与start
和stop
的长度相同。我们可以用
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