【问题标题】:How to match each row in a dataframe and fill up a matrix using the information?如何匹配数据框中的每一行并使用信息填充矩阵?
【发布时间】:2016-11-15 07:07:40
【问题描述】:

我有一个数据框“df”,它包含 2 列:名称和 ID。
df 的值是:
名称    ID
A           001
B 004
C           004
D           006
E           007

我有一个矩阵 Mat (用 0 初始化),其中包含所有作为行的名称和所有可能的 ID (包括 df 中没有的 ID,例如 002 和 005)作为列。我要做的是将每个名称与它们在df中的ID进行匹配,并将1放在Mat中的特定位置。

Mat的结构为:
    001 002  003  004  005  006  007
A
B
C
D
E

这是我在这里的第一个问题。对于任何无意的错误,我们深表歉意。

【问题讨论】:

  • @Rasif Ajwad 制作了一个可重现的示例(使用 dput)。然后给出预期的输出,并显示你是否做过任何编程
  • 在这种情况下,这只是table(df)
  • 非常感谢。我知道有更简单的方法,但就是找不到。

标签: r matrix dataframe


【解决方案1】:

将来,包括一个 MWE,如下所示。

你应该能够做到这一点:

df <-
  data.frame(
    Name = LETTERS[1:5]
    , ID = formatC(c(1,4,4,6,7), width = 3, flag = "0")
    , stringsAsFactors = FALSE
  )

Mat <- 
  matrix(0, nrow = 5, ncol = 7
         , dimnames = list(LETTERS[1:5]
                           , formatC(1:7, width = 3, flag = "0")))

for(i in 1:nrow(df)){
  Mat[df$Name[i], df$ID[i]] <- Mat[df$Name[i], df$ID[i]] + 1
}

Mat

请特别注意stringsAsFactors == FALSE。如果没有它,您将需要将 df$Namedf$ID 包装在 as.character 中,否则它们将成为因子并以数字方式返回其索引而不是字符标签。

我还在该位置添加了 1 而不是仅将其设置为“1”,因为您的问题不清楚是否可能有重复。如果没有重复,可能有更优雅的方法可以做到这一点,特别是如果没有重复的 ID(如@alistaire 建议的diag 解决方案),但如果有重复并且您没有明确的处理,这些方法可能会失败给他们。

编辑:我是怎么熬过来的,直到我阅读了@alistaire 的编辑评论后才意识到我正在重新创建table

现在你确实想要这些因素:

df <-
  data.frame(
    Name = LETTERS[1:5]
    , ID = factor(formatC(c(1,4,4,6,7), width = 3, flag = "0")
                  , levels = formatC(1:7, width = 3, flag = "0") )
  )

table(df)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2018-09-03
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多