Я понимаю, что есть ряд вопросов по этой теме, но я не смог решить свою проблему, просмотрев различные ответы. У меня есть ФР - экстракт которого прилагается ниже:Разбиение df по факторам, применение функции и возврат комбинированного df в r
ID = as.factor(c("1","1","1","1","1",
"2","2","2",
"3","3","3","3",
"4","4","4","4","4"))
AdDate = c("2010-03-04", "2010-04-05", "2011-01-23", "2011-03-20", "2012-07-08",
"2010-12-02", "2011-05-17", "2011-09-11",
"2010-04-11", "2010-05-15", "2011-02-22", "2011-09-23",
"2009-10-04", "2010-02-15", "2010-08-17", "2011-06-20", "2012-04-08")
OpofInterest = c("FALSE", "FALSE", "TRUE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE",
"FALSE", "FALSE", "TRUE", "FALSE",
"FALSE", "FALSE", "TRUE", "FALSE", "FALSE")
df = data.frame(ID, AdDate, OpofInterest)
Что я тогда хочу сделать, это разделить ФР по идентификатору в ряд dataframes (4 в этом примере), а затем применить функцию ниже назначить, будут ли другие эпизоды (каждая строка) до (до операции), одна и та же (за операцию) или после операции интереса (после операции) для каждого человека (ID) на основе AdDate. Я новичок в R и программировании и создал функцию ниже. На самом деле, у меня есть тысячи идентификаторов и эпизодов и около 80 столбцов, поэтому я не могу индивидуально подмножать и применять функцию, которую я должен работать после некоторой настройки.
prepostassignment <- function (df) {
df_OpofInterest = subset(df,(df["OpofInterest"] == "TRUE"))
for (i in 1:nrow(df)) {
if (df$AdDate[i] < df_OpofInterest$AdDate) {
df$Pre_Post_Assignment[i] = "Pre"
} else if (df$AdDate[i] == df_OpofInterest$AdDate) {
df$Pre_Post_Assignment[i] = "Per"
} else if (df$AdDate[i] > df_OpofInterest$AdDate) {
df$Pre_Post_Assignment[i] = "Post"
}
}
}
Я играл вокруг с помощью, tapply, агрегат, ddply и не могу придумать решения. Кроме того, я получаю следующее сообщение об ошибке при использовании функции на ручное подмножестве:
отсутствующего значения где TRUE/FALSE необходимого
Я прочитал на этом, как хорошо, но не могу понять, где он собирается неправильно в моем конкретном коде
То, что я хочу, чтобы в конечном итоге заключается в следующем:
ID = as.factor(c("1","1","1","1","1",
"2","2","2",
"3","3","3","3",
"4","4","4","4","4"))
AdDate = c("2010-03-04", "2010-04-05", "2011-01-23", "2011-03-20", "2012-07-08",
"2010-12-02", "2011-05-17", "2011-09-11",
"2010-04-11", "2010-05-15", "2011-02-22", "2011-09-23",
"2009-10-04", "2010-02-15", "2010-08-17", "2011-06-20", "2012-04-08")
OpofInterest = c("FALSE", "FALSE", "TRUE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE",
"FALSE", "FALSE", "TRUE", "FALSE",
"FALSE", "FALSE", "TRUE", "FALSE", "FALSE")
Pre_Post_Assignment = c("Pre", "Pre", "Per", "Post", "Post",
"Pre", "Per", "Post",
"Pre", "Pre", "Per", "Post",
"Pre", "Pre", "Per", "Post", "Post")
df_new = data.frame(ID, AdDate, OpofInterest, Pre_Post_Assignment)
Любая помощь будет принята с благодарностью.
Спасибо.
Что такое 'df_OpofInterest' и' df_TAVI' в вашем втором куске кода? – josliber
Извинения, df_TAVI должен был быть df_OpofInterest. Я подмножал «Op of interest», чтобы получить AdDate для использования в функции – sgurwin
Почему вы начинаете с столбцов класса 'character' (которые затем преобразуются в' factor')? Не должен ли ID быть «целочисленным», дата «Date», OpofInterest «логична»? –