Borykam się z tym :
Przykładowe dane :
foo <- structure(c("1", "1", "1", "1", "1", "1", "2", "2", "2", "2",
"2", "2", "2", "2", "2", "C", "C", "C", NA, NA, NA, NA, "C",
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C",
"C", NA, NA, NA, NA, NA, "C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", "C", NA, NA, NA, NA, "C", "C", "C", "C", "C", "C",
"C", "C", NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", "C", NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", "C", NA, NA,
NA, NA, NA, "C", "C", NA, NA, NA, NA, NA, "C", "C", "C", NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "C", "C", "C", "C",
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C",
"C", NA, NA, "C", "C", "C", "C", "C", NA, "C", "C", "C", "C",
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", NA, NA, "C", "C", NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA), .Dim = c(15L, 13L), .Dimnames = list(NULL, c("weeks",
"vv", "rv", "ja", "aa", "bv", "aj", "vb", "rj", "rr", "vr", "bb",
"jr")))
Jak pogrupować te dane według tygodni i zastosować funkcję rle? Oczekiwany wynik to:
out <- structure(c("weeks", "1", "2", "vv", "1", "1", "rv", "0", "1",
"ja", "1", "1", "aa", "1", "1", "bv", "1", "0", "aj", "1", "1",
"vb", "1", "0", "rj", "1", "0", "rr", "1", "1", "vr", "2", "2",
"bb", "1", "1", "jr", "1", "0"), .Dim = c(3L, 13L), .Dimnames = list(
NULL, NULL))
Próbowałem do tej pory :
test <- aggregate(foo, by=data.frame(foo[,1]), function(x,na.rm=T) rle(as.numeric(x))$values)
Daje mi listę (zgodnie z oczekiwaniami z rle), którą mogę następnie obliczyć i spróbować uzyskać oczekiwany wynik. Ale jestem pewien, że istnieje czystszy sposób na osiągnięcie tego... Jakieś pomysły?
Dzięki za szukanie!
2 odpowiedzi
Najwyraźniej kilka sposobów przetwarzania danych wyjściowych rle; oto kolejny.
d <- data.frame(foo)
aggregate(!is.na(d[,-1]), d[,1,drop=FALSE], function(x) sum(rle(x)$values))
# weeks vv rv ja aa bv aj vb rj rr vr bb jr
# 1 1 1 0 1 1 1 1 1 1 1 2 1 1
# 2 2 1 1 1 1 0 1 0 0 1 2 1 0
Skończyło się na czymś bardzo podobnym... nie jestem pewien, której odpowiedzi szukasz:
aggregate(list(foo[, -1]), list(weeks = foo[, 1]),
function(x) length(na.omit(rle(x)$values)))
weeks vv rv ja aa bv aj vb rj rr vr bb jr
1 1 1 0 1 1 1 1 1 1 1 2 1 1
2 2 1 1 1 1 0 1 0 0 1 2 1 0
Podobne pytania
Nowe pytania
r
R to darmowy język programowania typu open source i środowisko oprogramowania do obliczeń statystycznych, bioinformatyki, wizualizacji i obliczeń ogólnych. Proszę podać minimalne i powtarzalne przykłady wraz z pożądanymi wynikami. Użyj dput () dla danych i określ wszystkie pakiety inne niż podstawowe za pomocą wywołań biblioteki (). Nie osadzaj obrazów dla danych lub kodu, zamiast tego użyj wciętych bloków kodu. W przypadku pytań związanych ze statystykami należy skorzystać z https://stats.stackexchange.com.