2017-06-27 23 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")) 

这是我之后的情节的一个例子。我管理的大量数据操作后做,但我有信心看到一只更好的解决方案:enter image description here

+0

'sapply(L,I = 1,函数(X,I)中X [I])'也许这会工作。这将返回每个数据帧的每个第一列。你可以改变我在sapply得到不同的列。同时,这是[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

或许,如果你这样做有tidyr和dplyr它会更容易:

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后的年调整相应的聚集地。

+0

我认为编辑大大改变了我所问的问题。我如何与我正在处理的对象共享一个文件?我尝试过,但它太大了,我认为这个例子并没有正确地代表我的问题。 – supercontra

1

您可以使用sapply此:

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

或指数:

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

然后你可以使用plyr包,让他们在其内部可用于绘制一个data.frame;

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 


更新:如何对付列表中遗漏值?

至于你提到你有缺失和空值,不同的列,等你的列表,这可以帮助你:

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