2017-06-27 14 views
0

ネットワーク内のユーザーの系列の中心値を別の年にプロットする必要があります。リスト内の特定の項目のみをプロットするR

私はいくつかのプロットに興味がありますが、それを行う方法を理解できず、すべてのユーザーが毎年出てくるわけではありません。

ここにデータの例を示します。 "jhpedraza"の値をプロットすることができます。たとえば、users=c("jhpedraza","other user")などの文字列を使用しても構いません。さらに"char_arturo"を試して、考えられるすべてのエラーを再現してください。

l=structure(list(`2009` = NULL, `2010` = NULL, `2011` = structure(c(0.0112191199212738, 
0.0119663133080306, 0.0112191199212738), .Names = c("jhpedraza", "didactech", 
"juanmanuelcorzo")), `2012` = structure(c(0.00520863174452703, 0.00543486753203931), 
.Names = c("jhpedraza", "lasillaenvivo")), `2013` = structure(c(0.00457122723603219, 
0.00362782800771276, 0.00342927774646075), .Names = c("jhpedraza", "milobeta", 
"char_arturo"))), split_type = "data.frame", split_labels = structure(list 
(`format(Date, "%Y")` = c("2009", "2010", "2011", "2012", "2013")), .Names = 
"format(Date, \"%Y\")", class = "data.frame", row.names = c(NA, -8L)), .Names = 
c("2009", "2010", "2011", "2012", "2013")) 

ここでは、私がプロットしたプロットの例を示します。私は、データ操作の多くの後にそれを行うために管理が、私はthere'saよりよい解決策確信して:あなたはtidyrとdplyrでこれをしなかった場合enter image description here

+0

'sapply(L、I = 1、関数(x、I)X [i])と'多分これが働くだろう。これは、各データフレームのすべての最初の列を返します。あなたはサプリーで私を変えて別の列を得ることができます。一方、これは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です。あなたが作ろうとしているものを投稿すれば、これよりはるかに簡単な答えが得られます。 – Masoud

+0

番号の代わりにあなたのコードアドレス名がうまくいきます:sapply(l、i = "jhpedraza"、function(x、i)x [i]) – supercontra

答えて

0

これはリスト上の別のSO質問のコードを使用して私が選んだ解決策です:

ttt <- do.call(rbind, lapply(l, data.frame, stringsAsFactors=FALSE)) 

ttt$an <- rownames(ttt) 

text <- as.character(ttt$an) 

p2=as.data.frame(text) %>% separate(text, into = c("Year","User")) 

ttt <- cbind(p2,ttt) 

names(ttt) <- c("Year","User","PageRank","id") 

ids <- c("jhpedraza","lasillaenvivo") 

qqq <- subset(ttt,User %in% ids) 


ggplot(qqq, aes(y = log(PageRank), x = Year, colour = as.factor(User))) + 
     geom_point() + 
     geom_smooth(aes(group = as.factor(User)),se=FALSE)+ggtitle("Centrality by Year") + labs(x="Year", y="Page Rank (log)") + labs(color='User') 

enter image description here

+0

あなたの答えが見つかったらうれしいです。あなたのメールにまだ返信する時間がありませんでした。乾杯。 – Masoud

0

おそらくそれが容易になるだろう:

a <- 1; b <- 2; c <- 3 

p2001 <- data.frame(a,b,c, yr = 2001) 

a <- 2; b <- 1; c <- 3; e <- 3 

p2002 <- data.frame(a,b,c,e, yr = 2002) 

a <- 2; c <- 3; e <- 3; f <- 4 

p2003 <- data.frame(a,c,e,f, yr = 2003) 

library(tidyr) 
library(dplyr) 
p.years <- bind_rows(p2001,p2002,p2003) 

p.years.gathered <- gather(p.years,key = USER,value = VALUE,c(1,2,3,5,6)) 

今、あなたは、興味のあるユーザのみにデータフレームをサブセット化することができます。bind_rowsの後にどのカラムがyrを持つかを監視し、それに応じて適切に調整する必要があります。

sapply(l, i="jhpedraza", function(x,i) x[i]) 

またはインデックスによって:

+0

私は尋ねていた質問を大幅に変更したと思います。私が作業しているオブジェクトとファイルをどのように共有できますか?私は試しましたが、大きすぎるので、私の例が私の質問を正しく表していないと思います。 – supercontra

1

あなたはこのためにsapplyを使用することができますそして、あなたはプロットするために使用することができます1 data.frameの内側にそれらを得るためにplyrパッケージを使用することができます

sapply(l, i=1, function(x,i) x[i]) 

library(plyr) 
df1 <- ldply(sapply(l, i=1, function(x,i) x[i]), data.frame) 

例プロット:

ggplot() + geom_line(aes(x=as.numeric(.id),y=X..i..), 
       data = df1, stat="identity") + 
    scale_x_continuous(breaks=as.numeric(df1$.id), labels=as.numeric(df1$.id)) + 
    ggtitle("Example Plot") + labs(x="Year", y="Value") + 
     theme(panel.background = element_rect(fill = "#eff0f1", 
            colour = "#eff0f1"), 
     plot.background = element_rect(fill = "#eff0f1")) 
 

      https://i.stack.imgur.com/9kWUN.png 


更新:リストの中に欠損値をどのように扱いますか?

あなたが述べたように、あなたが不足しているとあなたのリストの中など、null値、異なる列、している、これはあなたを助けるかもしれない:

df.completed <- plyr::ldply(lapply(l, Filter, f = Negate(is.null)),rbind) 

これはあなたに各年の行を持つデータフレーム(各データフレームを与えますあなたのリストにある)とすべての列。列の値が見つからない場合はNAとなります。あなたの例のデータセットについて

これは出力のようになります。

# > df.completed 

# .id jhpedraza didactech juanmanuelcorzo lasillaenvivo milobeta char_arturo 
# 1 2011 0.011219120 0.01196631  0.01121912   NA   NA   NA 
# 2 2012 0.005208632   NA    NA 0.005434868   NA   NA 
# 3 2013 0.004571227   NA    NA   NA 0.003627828 0.003429278 

そして、あなたは、このような列(ちょうど目的の列にjhpedrazaを変更)のいずれかをプロットすることができます

ggplot() + geom_line(aes(x=as.numeric(.id),y=jhpedraza), 
      data = df.completed[complete.cases(df.completed$jhpedraza),], stat="identity") + 
    scale_x_continuous(breaks=as.numeric(df1$.id), labels=as.numeric(df1$.id)) + 
    ggtitle("Example Plot") + labs(x="Year", y="jhpedraza") + theme_bw() 
 

      https://i.stack.imgur.com/emNAo.png 

+0

これはすばらしいです、ありがとう! > df1 < - ldply(sapply(l、i = "jhpedraza"、function(x、i)x [i])、data.frame) ユーザ名を使用するとこのエラーが発生します。 FUN(X [[i]]、...)のエラー:行名に欠損値が含まれています – supercontra

+0

すべてのユーザーが毎年値を持っているわけではなく、特定の順序ではないため、インデックスが機能しません... – supercontra

+0

'' jhpedraza ''の使用中に問題はありません。エラーを再現するdata.setを提供します。 – Masoud

関連する問題