【问题标题】:Subsetting data.frame in in specific order in R (for setting vertex attributes)在 R 中以特定顺序对 data.frame 进行子集(用于设置顶点属性)
【发布时间】:2015-06-07 09:31:54
【问题描述】:

我在包含两列的 data.frame 中有信息,例如:

name  age
a     10
b     20
c     30

我有一个名单c b d。现在我想按列表的顺序获取原始数据框的属性的data.frame(或列表或任何东西)。对于上面的例子,那将是

name  age
c     30
b     20
d     NA

我觉得这应该不会太难(甚至可能是内联),但我无法在 R 中找到方法。

背景:

我有一个从边缘列表创建的“网络”对象。我有另一个顶点属性,但对最初如何排序这些属性没有权力。现在我想要 为网络顶点分配这些属性。

但是为了使用

  • network %v% "age" <- dataframe[,2] 我需要数据框的顺序正确

为了

  • set.vertex.attribute(network, "age", hhs$age, v = hhs$di) 我需要顶点 ID

【问题讨论】:

    标签: r networking dataframe subset sna


    【解决方案1】:

    我获取了您的姓名列表 ls,并将其设为具有相同 name 名称的 data.frame

    然后我从dplyr使用left_join

    ls<-c("c","b","d")
    df2<-data.frame(name=ls)
    
    df2 %>% left_join(df,by="name")->new_df
    
    > new_df
      name age
    1    c  30
    2    b  20
    3    d  NA
    

    或者,如果您不熟悉 dplyr/magrittr 管道,您可以将其重写为:

    new_df<-left_join(df2,df,by="name")
    

    因为它产生相同的结果:

    > new_df
      name age
    1    c  30
    2    b  20
    3    d  NA
    

    事实上,由于df2只有name,你甚至不需要指定by=参数。

    new_df<-left_join(df2,df)
    

    产生相同的结果。

    【讨论】:

      【解决方案2】:

      这可以通过match 函数在基础 R 中的一行中完成:

      data.frame(name=names, age=df$age[match(names, df$name)])
      #   name age
      # 1    c  30
      # 2    b  20
      # 3    d  NA
      

      数据:

      names <- c("c", "b", "d")
      df <- data.frame(name=c("a", "b", "c"), age=c(10, 20, 30))
      

      【讨论】:

        猜你喜欢
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-11
        • 2017-01-18
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        相关资源
        最近更新 更多