【问题标题】:plotting only specific items in a list in R仅在 R 中的列表中绘制特定项目
【发布时间】:2017-06-27 15:23:29
【问题描述】:

我需要为网络中不同年份的用户绘制一系列中心值。

我只对绘制一些感兴趣,但我不知道该怎么做,而且并非所有用户每年都会出现。

以下是数据示例。我希望能够为"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"))

这是我所追求的情节的一个例子。经过大量数据操作后,我设法做到了,但我相信有更好的解决方案:

【问题讨论】:

  • sapply(l, i=1, function(x,i) x[i]) 也许这会起作用。这将返回每个数据帧的第一列。您可以在 sapply 中更改 i 以获得不同的列。同时,这是一个XY problem。发布您想要绘制的内容,您可能会比这更容易得到答案。
  • 谢谢,您的代码寻址名称而不是数字效果很好:sapply(l, i="jhpedraza", function(x,i) x[i])

标签: r list dataframe ggplot2 apply


【解决方案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"))

更新:如何处理列表中的缺失值?

正如您提到的,您的列表中有缺失值和空值、不同的列等,这可能会对您有所帮助:

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()

【讨论】:

  • 这太棒了,谢谢!当我使用我真正需要的用户名时出现此错误:> df1
  • 不是每个用户每年都有一个价值,而且他们没有特定的顺序,这就是索引不起作用的原因......
  • 我在使用'jhpedraza'时仍然没有任何问题。提供重现错误的 data.set。
  • 试试“char_arturo”
【解决方案2】:

如果你用 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 之后有 yr 并相应地调整聚集。

【讨论】:

  • 我认为编辑大大改变了我提出的问题。如何与我正在处理的对象共享文件?我试过了,但它太大了,我认为这个例子不能正确代表我的问题。
【解决方案3】:

这是我选择的解决方案,使用列表中另一个 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2013-08-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多