У меня проблема с двумя частями. Я искал весь стек и нашел ответы, связанные с моими проблемами, но никакие варианты, которые я пробовал, еще не работали. Заранее благодарю за любую помощь!Добавление стандартизованных переменных в кадр данных с использованием dplyr и цикла for
У меня есть большой фрейм данных, который содержит много переменных.
Первый, я хочу (1) стандартизировать переменную другой переменной (в моем случае, динамик), и (2) отфильтровать значения после того, как переменная была стандартизирована (более 2 стандартных отклонений от имею в виду). (1) и (2) может быть рассмотрена с помощью функции dplyr.
Second У меня есть много переменных, для которых я хочу это сделать, поэтому я пытаюсь найти автоматизированный способ сделать это, например, с циклом for.
Задача 1: Дать функцию, содержащую функции dplyr
Вот пример того, что мой кадр данных выглядит следующим образом:
df = data.frame(speaker=c("eng1","eng1","eng1","eng1","eng1","eng1","eng2","eng2","eng2","eng2","eng2"),
ratio_means001=c(0.56,0.202,0.695,0.436,0.342,10.1,0.257,0.123,0.432,0.496,0.832),
ratio_means002=c(0.66,0.203,0.943,0.432,0.345,0.439,0.154,0.234,NA,0.932,0.854))
Выход:
speaker ratio_means001 ratio_means002
1 eng1 0.560 0.660
2 eng1 0.202 0.203
3 eng1 0.695 0.943
4 eng1 0.436 0.432
5 eng1 0.342 0.345
6 eng1 10.100 0.439
7 eng2 0.257 0.154
8 eng2 0.123 0.234
9 eng2 0.432 NA
10 eng2 0.496 0.932
11 eng2 0.832 0.854
Ниже базовый код Я хочу превратиться в функцию:
standardized_data = group_by(df, speaker) %>%
mutate(zRatio1 = as.numeric(scale(ratio_means001)))%>%
filter(!abs(zRatio1) > 2)
Так что кадр данных будет выглядеть следующим образом (к примеру):
speaker ratio_means001 ratio_means002 zRatio1
(fctr) (dbl) (dbl) (dbl)
1 eng1 0.560 0.660 -0.3792191
2 eng1 0.202 0.203 -0.4699781
3 eng1 0.695 0.943 -0.3449943
4 eng1 0.436 0.432 -0.4106552
5 eng1 0.342 0.345 -0.4344858
6 eng2 0.257 0.154 -0.6349445
7 eng2 0.123 0.234 -1.1325034
8 eng2 0.432 NA 0.0148525
9 eng2 0.496 0.932 0.2524926
10 eng2 0.832 0.854 1.5001028
Вот что я имею в терминах функции до сих пор. Частичные работы мутировать, но я боролся с добавлением фильтра:
library(lazyeval)
standardize_variable = function(col1, new_col_name) {
mutate_call = lazyeval::interp(b = interp(~ scale(a)), a = as.name(col1))
group_by(data,speaker) %>%
mutate_(.dots = setNames(list(mutate_call), new_col_name)) %>%
filter_(interp(~ !abs(b) > 2.5, b = as.name(new_col_name))) # this part does not work
}
я получаю следующее сообщение об ошибке при попытке запустить функцию:
data = standardize_variable("ratio_means001","zRatio1")
Error in substitute_(`_obj`[[2]], values) :
argument "_obj" is missing, with no default
Задача 2: Циклическое над функция
Есть много переменных, к которым я бы хотел применить вышеприведенную функцию, поэтому я хотел бы найти способ использовать цикл или другую полезную функцию, чтобы помочь автоматизировать этот процесс. Имена переменных отличаются только числом в конце, так что я придумал что-то вроде этого:
d <- data.frame()
for(i in 1:2)
{
col1 <- paste("ratio_means00", i, sep = "")
new_col <- paste("zRatio", i, sep = "")
d <- rbind(d, standardize_variable(col1, new_col))
}
Однако, я получаю следующее сообщение об ошибке:
Error in match.names(clabs, names(xi)) :
names do not match previous names
Еще раз спасибо за любую помощь на эти проблемы!
добавьте небольшой пример ваших данных – rawr
Одно общее предложение - начать с фрагментов того, что вы хотите сделать, а затем создать его.Например, начните с меньшего набора тестовых данных, который вы можете использовать здесь для восстановления вашей проблемы. В этих строках, если у вас есть две отдельные проблемы, попробуйте сначала, заработайте свою функцию, а затем перейдите к второй проблеме. – lmo
Пример данных. Спасибо за отзыв Имо. Я обсуждал снятие второй части с проблемы, но две части взаимосвязаны для моей конкретной проблемы, поэтому я решил оставить вторую часть. Может быть более простой способ решить проблему в целом, где два шага могут быть объединены в один (но я еще не понял этого). Еще раз спасибо за ваши ответы! – Amanda