【问题标题】:dynamically adding variable columns to a data frame in R动态地将变量列添加到 R 中的数据框
【发布时间】:2019-07-15 20:14:14
【问题描述】:

我有两个数据集(csv 文件,即 1000 列和 200 列),我想根据两个列元素的准确性将第二个数据集的一些列名动态添加到我的第一个数据集中两个数据集。 (困惑:看下面的预期和实际结果)

我尝试放入两个 for 循环来逐个元素进行比较。一旦匹配列元素(匹配标准),就将该元素拾取并放入向量中。 对内部for循环中的所有元素重复该过程->一旦内部for循环完成,转置向量并将其转换为列向量->根据外部for循环行值将列添加到该特定行

     df_1$Res_1 <- NA
     df_1$Res_1 <- as.character(df_1$Res_1)
     df_1_1 <- rep(NA,10)
     df_1_1 <- as.character(df_1_1)  
     c = 1
     for (p in 1:nrow(df_1)){
          for(q in 1:nrow(df_2)){
              if((df_1$Mat_1[p] == df_2$Mat_2[q]) {  
                 df_1_1[c] <- df_2$Res[q]
                 c = c+1
                                                  }
                 df_1_1 <- t(df_1_1)
                 df_1$Res_1[p,] <- df_1_1[]  #not sure how to add the remaining            #columns like Res_2 and Res_3 etc 
                                }
                 c = 1
             }

(link to drive.google.com)

错误是

df_1$Res_1[p,] <- df_1_1[]:
incorrect number of subscripts on matrix

(link to docs.google.com/spreadsheets)

【问题讨论】:

  • 数据图片难以处理,请以有效的 R 语法发布复制/粘贴示例数据,使用dput() 或共享代码来模拟数据。
  • 另外,假设我猜对了,我会要求您在下一个问题中尝试更具体。 “我想根据两个数据集中两个列元素的准确性,将第二个数据集的一些列名动态添加到我的第一个数据集中。” 对我来说很难理解。更清晰的表述:“当df2$Mat_2 值与df1$Mat_1 值匹配时,我想将df2$Res 中的值添加到df1。我希望将多行中的匹配df2$Res 添加到单个行中df1 中的行,根据需要创建尽可能多的新列。" 使用特定名称要好得多。
  • 嗨@Gregor,非常感谢您的解决方案。一个月以来,我一直坚持这一点。我想将与 Res 对应的列添加到输出文件中。我已经更新了谷歌,以便更好地解释。请查看更新的输出文件并建议修改代码。 link我正在考虑做这个改变:select(Mat_2, Res, col_1, group_no)
  • Stack Overflow 旨在帮助很多人——而不仅仅是一个人。为此,我们要求问题尽可能独立。我们希望未来的读者能够阅读这个问题,看看它是否与他们有关,如果是的话,能够看到答案。因此,与其链接到既将问题隐藏在链接后面又可能随时成为死链接的谷歌电子表格,请在问题本身中分享您的数据 - 就像我在答案的底部开始的那样。
  • 也就是说,既然我已经回答了最初提出的问题,我进一步建议您在引入新要求时开始一个新问题。我认为您可以使用this question as a reference 自己解决这些更改。您需要做出的重大改变是修改我的melt 命令以处理多组列。我认为data.table::melt 版本和tidyr::pivot_longer 一样。

标签: r


【解决方案1】:

据我所知,这就是你想要的:

library(reshape2)
library(dplyr)

df3 = df2 %>%
  group_by(Mat_2) %>%
  mutate(group_no = row_number()) %>%
  select(Mat_2, Res, group_no) %>%
  melt(id.vars = c("Mat_2", "group_no")) %>%
  mutate(variable = paste(variable, group_no, sep = "_")) %>%
  select(-group_no) %>%
  dcast(Mat_2 ~ variable, data = .)


left_join(df1, df3, by = c("Mat_1" = "Mat_2"))
#    Mat_1 Col_1 Col_2 Col_3 Res_1 Res_2 Res_3
# 1      A     d     d     d    QQ    TT    YY
# 2      B     o     o     o    RR    TT  <NA>
# 3      C     e     e     e    QQ  <NA>  <NA>
# 4      A     n     n     n    QQ    TT    YY
# 5      E     o     o     o    FF  <NA>  <NA>
# 6      C     t     t     t    QQ  <NA>  <NA>
# 7      G     m     m     m    QQ  <NA>  <NA>
# 8      B     a     a     a    RR    TT  <NA>
# 9      A     t     t     t    QQ    TT    YY
# 10     X     t     t     t  <NA>  <NA>  <NA>
# 11     R     e     e     e    YY  <NA>  <NA>
# 12     A     r     r     r    QQ    TT    YY
# Warning message:
# Column `Mat_1`/`Mat_2` joining factors with different levels, coercing to character vector 

使用这些数据:

df1 = read.table(text = 'Mat_1  Col_1   Col_2   Col_3
A   d   d   d
B   o   o   o
C   e   e   e
A   n   n   n
E   o   o   o
C   t   t   t
G   m   m   m
B   a   a   a
A   t   t   t
X   t   t   t
R   e   e   e
A   r   r   r', header = T)

df2 = read.table(text = 'ID Mat_2   Res Col_1   Col_2   Col_3
1   A   QQ  i   i   i
2   C   QQ  t   t   t
3   V   EE  r   r   r
4   B   RR  e   e   e
5   G   QQ  a   a   a
6   A   TT  l   l   l
7   E   FF  l   l   l
8   B   TT  y   y   y
9   A   YY  d   d   d
10  P   RR  s   o   o
11  O   EE  e   e   e
12  O   TT  n   n   n
13  R   YY  o   o   o
14  T   UU  t   t   t
15  M   OO  m   m   m
16  M   ZZ  a   a   a
17  N   VV  t   t   t
18  J   AA  t   t   t
19  K   SS  e   e   e
20  L   EE  r   r   r', header = T)

【讨论】:

  • 嗨@Gregor,非常感谢您的解决方案。一个月以来,我一直坚持这一点。我想将与 Res 对应的列添加到输出文件中。我已经更新了谷歌,以便更好地解释。请查看更新的输出文件并建议修改代码。 link我正在考虑做这个改变:select(Mat_2, Res, col_1, group_no)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多