2017-09-02 2 views
0

Dieses Thema ist eine Mischung aus this one und this one. Meine Probleme kommen von meiner Unfähigkeit, Funktionen/Code an alle Elemente einer Liste von tibbles zu übergeben. Ich weiß, wie man die gewünschten Ergebnisse Zeile für Zeile bekommt, aber nicht in einem Ganzen.R: zusammenfassen, Spalten löschen Namen des Datenrahmens in einer Liste ändern und Ergebnis in env speichern

Für Thema, nehmen wir zwei tibbles sehr ähnlich in der Struktur zu meinem realen Fall.

MyRes_tw <- structure(list(text = c("follow @SmartRE_Info and get your token in waves t.co/g3q4XelPaK #SmartRE", 
"RT @investFeed: Make your FEED work for you - check out this blog on the power of the FEED token: t.co/JOHSCeitGc", 
"RT @investFeed: WE HAVE NOW PASSED 8,000 $ETH IN OUR TOKEN SALE PURCHASED! t.co/bx7s1xWyXI #ICO #Tokensale t.co/ZFndFhUfVT" 
), Tweet.id = c("889602043249254400", "889589518159945729", "889573909405679616" 
), created.date = structure(c(17371, 17371, 17371), class = "Date"), 
    created.week = c(30, 30, 31), retweet = c(0, 0, 0), custom = c(0, 
    0, 0)), .Names = c("text", "Tweet.id", "created.date", "created.week", 
"retweet", "custom"), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame")) 

MyRes1_tw <- structure(list(text = c("RT @AmbrosusAMB: We are on the front page of #NASDAQ/#Editorial Choice, Proud #Ethereum #Blockchain #ICO #TGE @Nasdaq @gavofyork @jutta_s…", 
"RT @MyBit_DApp: 10 minutes left in #mybit #tokensale over 10,000 #ethereum contributed! Check it out t.co/AgyRCcyyzD", 
"RT @MyBit_DApp: only 23 ETH left now", "RT @MyBit_DApp: #MyBit #tokensale ends in ~1 hour. 9k+ $ETH raised so far. Only 125 #ethereum left at 25% discount. t.co/AgyRCcyyzD", 
"RT @MyBit_DApp: ~12 hours left in the t.co/AgyRCcyyzD #TokenSale #ICO 25% Bonus activated for #ethereum $ether #bitcoin $BTC $xbt" 
), Tweet.id = c("897499492219445252", "897487635442274305", "897487621714305024", 
"897487610494558208", "897487593117450244"), created.date = structure(c(17393, 
17393, 17393, 17393, 17393), class = "Date"), created.week = c(33, 
33, 34, 34, 34), retweet = c(0, 0, 0, 0, 0), custom = c(0, 0, 
0, 0, 0)), .Names = c("text", "Tweet.id", "created.date", "created.week", 
"retweet", "custom"), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame")) 

Diese beiden Daten stammen von Twitter. Ich möchte ihnen etwas ordentlich zu tun, um diese Ergebnisse am Ende zu bekommen:

MyRes <- structure(list(created.week = c(33, 34, 35), retweet = c(12, 
0, 8), custom = c(0, 0, 2), Twitter.name = c("MyRes", "MyRes", 
"MyRes")), .Names = c("created.week", "retweet", "custom", "Twitter.name" 
), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame" 
)) 

MyRes1 <- structure(list(created.week = c(33, 34, 35), retweet = c(12, 
0, 8), custom = c(0, 0, 2), Twitter.name = c("MyRes1", "MyRes1", 
"MyRes1")), .Names = c("created.week", "retweet", "custom", "Twitter.name" 
), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame" 
)) 

Bitte beachten Sie, dass Namen von Bedeutung sind, den Namen jedes der Name Tibbles von Anfang zu sein Ergebnis tibble mit _tw fallen gelassen werden.

Beachten Sie bitte auch, dass die letzte Spalte $ Twitter.name im Endergebnis den tibble-Namen widerspiegelt.

I Liste meine Tibbles in meiner Umgebung auf diese Weise myUser.tw <- ls(,pattern = "_tw") da sie die einzigen Objekte sind mit der Endung _tw.

schrieb ich diese Funktion helfen:

MySummarize <- function(x){ 
    summarise(group_by(x, created.week, Retweet.count = sum(retweet), Custom.count = sum(custom))) 
} 

nun den Schmerz kommt! Unten ist mein Arbeitscode:

testLst <- mget(myUser.tw) %>% 
    lapply(function(x) MySummarize(x)) %>% 
    list2env(testLst, envir = .GlobalEnv) 

Dann kann ich nicht einen Weg finden:

die Namen der df
  1. Änderung Myres zu bekommen, da MyRes1 Namen
  2. eine Spalte mit allen hinzufügen Zeilen mit dem obigen Text (MyRes, MyRes1)
  3. speichern Sie das Ergebnis in meiner Umgebung.

glaube es oder nicht, ich habe auf eine sehr lange Zeit gewesen. Ich würde mich freuen, wenn ich helfen könnte, meinen gesamten Code zu finalisieren. Danke

Antwort

1

Ein möglicher Ansatz:

# list of tibbles with tw 
myUser.tw.list <- mget(myUser.tw) 

# perform lapply over the sequence of positions rather than the list of elements 
myUser <- lapply(seq(myUser.tw), 
     function(i){ 
     myUser.tw.list[i][[1]] %>% group_by(created.week) %>% 
      summarise(retweet = sum(retweet), custom = sum(custom)) %>% 
      ungroup() %>% 
      mutate(Twitter.name = gsub("_tw$", "", names(myUser.tw.list[i]))) 
     }) 
names(myUser) <- gsub("_tw$", "", myUser.tw) 

Ergebnis: Liste der Tibbles mit Namen

> myUser 
$MyRes 
# A tibble: 2 x 4 
    created.week retweet custom Twitter.name 
     <dbl> <dbl> <dbl>  <chr> 
1   30  0  0  MyRes 
2   31  0  0  MyRes 

$MyRes1 
# A tibble: 2 x 4 
    created.week retweet custom Twitter.name 
     <dbl> <dbl> <dbl>  <chr> 
1   33  0  0  MyRes1 
2   34  0  0  MyRes1 
2

Es war nicht klar, was „die df“ bezieht sich auf, aber wenn das Ziel ist, eine Liste von Zusammenfassungen mit einer Quellspalte zu erhalten angefügt:

library(dplyr) 

myUser.tw %>% 
    mget(.GlobalEnv) %>% 
    lapply(MySummarize) %>% 
    bind_rows(.id = "source") %>% 
    mutate(source = sub("_tw$", "", source)) %>% 
    split(.$source) 

geben:

$MyRes 
# A tibble: 2 x 4 
# Groups: created.week, Retweet.count [2] 
    source created.week Retweet.count Custom.count 
    <chr>  <dbl>   <dbl>  <dbl> 
1 MyRes   30    0   0 
2 MyRes   31    0   0 

$MyRes1 
# A tibble: 2 x 4 
# Groups: created.week, Retweet.count [2] 
    source created.week Retweet.count Custom.count 
    <chr>  <dbl>   <dbl>  <dbl> 
1 MyRes1   33    0   0 
2 MyRes1   34    0   0 

oder wenn Sie einen einzelnen Datenrahmen möchten, lassen Sie die split aus.

+0

TY für Ihre Lösung. Ich muss zugeben, dass ich nicht weiß, welchen ich bevorzuge, sagen wir mal "Mädchenpower". :-) – gabx

Verwandte Themen