У меня есть два вектора чисел: v1 и v2 Первый - это набор действительных чисел. Второй - это набор десятичных знаков, которые я хочу округлить или отформатировать v1.

Вот векторы:

v1 <- c(7.449835, 6.649058, 9.072736, 5.643506, 8.979166, 5.544238, 1.746717, 4.151327, 8.408533, 1.176206)
v2 <- c(1, 2, 0, 3, 4, 6, 1, 2, 2, 3)

Результат, который я хочу, таков:

[1] 7.4 6.64 9 5.643 8.9791 5.544238 1.7 4.15 8.40 1.176

... где первый вектор округляется / форматируется в соответствии со вторым вектором. Меня не волнует, будет ли результат символьным или числовым вектором. Но в итоге чисел много, и я не хочу использовать цикл:

Обратите внимание, что это не работает:

format(v1, digits = v2)
 [1] "7" "7" "9" "6" "9" "6" "2" "4" "8" "1"

И это не работает:

round(v1, digits = v2)
[1] 7.400000 6.650000 9.000000 5.644000 8.979200 5.544238 1.700000 4.150000 8.410000 1.176000

Итак, как я могу динамически округлять или форматировать вектор без использования цикла в R?

r
2
David J. Bosak 9 Окт 2021 в 01:49

2 ответа

Лучший ответ

Аргумент ?sprintf fmt может принимать « вектор символов строк формата ».

Таким образом, вы можете объединить форматы вместе, вставив вектор цифр формата с синтаксисом формата sprintf, например. paste0("%#.", v2, "f").

Все вместе

sprintf(v1, fmt=paste0("%#.", v2, "f"))
3
user20650 8 Окт 2021 в 23:26

Вы можете использовать round, а затем удалить конечные нули, как предлагается в этом ответе

v1 <- c(7.449835, 6.649058, 9.072736, 5.643506, 8.979166, 5.544238, 1.746717, 4.151327, 8.408533, 1.176206)
v2 <- c(1, 2, 0, 3, 4, 6, 1, 2, 2, 3)
v1 <- round(v1, digits = v2)
v1 <- sub("0+$", "", as.character(v1))
1
ViviG 8 Окт 2021 в 23:11