R самый быстрый способ суммирования двухсимвольных векторов в столбцах data.frame и вычисления угла - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть data.frame с 2 столбцами:

df <- data.frame(v1 = c("3.6854756000000001848,-6.4375996000000004216,8.8997513999999995349",
                        "1.8968172299999999098,-5.4934801999999995914,1.5116269712000001135"),
                 v2 = c("2.8782294999999997742,-2.5761130000000000972,3.0410891000000002116",
                        "2.1329812999999999690,-9.3830139999999992995,7.5242144999999993615"),
                 stringsAsFactors = FALSE)
df$vsum <- as.numeric(df$v1) + as.numeric(df$v2)
# get warning and NA values in vsum column

Я хочу получить сумму этих векторов в столбце vsum самым быстрым способом (возможно, с использованием пакета data.table), потому что в исходных данных у меня есть миллионыиз этих строк.

Также мне нужно вычислить угол между этими векторами в столбце тета:

theta <- acos( sum(v1*v2) / ( sqrt(sum(v1 * v1)) * sqrt(sum(v2 * v2)) ) )

1 Ответ

0 голосов
/ 06 декабря 2018

пожалуйста, прочитайте о stringsAsFactors

df <- data.frame(v1 = c("3.6854756000000001848,-6.4375996000000004216,8.8997513999999995349",
                            "1.8968172299999999098,-5.4934801999999995914,1.5116269712000001135"),
                     v2 = c("2.8782294999999997742,-2.5761130000000000972,3.0410891000000002116",
                            "2.1329812999999999690,-9.3830139999999992995,7.5242144999999993615"),
 stringsAsFactors = FALSE)

, возможно, одно из более быстрых решений:

sum(as.numeric(unlist(lapply(df, strsplit, ","))))
#[1] 7.679979

, как @Roland заявляет в комментарии,Основная проблема здесь не в суммировании чисел.Проблема в том, что ваши числа вставляются в виде строк с "," в качестве разделителя.Посмотрите, сможете ли вы намного раньше в своем рабочем процессе предотвратить эту «болезнь».


Если вы не можете предотвратить странный формат ввода, ваш первый шаг может выглядеть следующим образом:

df_numerics <- as.data.frame(lapply(df, function(x) {as.numeric(unlist(lapply(x, strsplit, ",")))}))

Должно быть достаточно быстро:

theta <- with( df_numerics,
               acos( sum(v1*v2) / ( sqrt(sum(v1 * v1)) * sqrt(sum(v2 * v2)) ) )
               )
#[1] 0.7876798

Если нет, возможно, вам придется вызывать c, c ++ и / или идти параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...