【问题标题】:Combine two data frames considering levels of factor of one data frame and column name of another data frame using r考虑一个数据框的因子级别和另一个数据框的列名,使用 r 组合两个数据框
【发布时间】:2023-03-14 15:29:01
【问题描述】:

我需要考虑因素水平为现有数据框创建一个新列。我有 2 个名为 dat_group 和 dat_prices 的数据框。这些数据框如下所示。

dat_group

         Group
1      A
2      A
3      A
4      A
5      A
6      A
7      A
8      A
9      A
10     A
11     C
12     C
13     C
14     C
15     C
16     C
17     C
18     C
19     C
20     C
21     B
22     B
23     B
24     B
25     B
26     B
27     B
28     B
29     B
30     B

dat_price

   A  B  C
1  21 45 24
2  21 45 24
3  21 45 24
4  21 45 24
5  15 11 10
6  15 11 10
7  15 11 10
8  20 13 55
9  20 13 55
10 20 13 55

考虑到 dat_group 中的级别,我需要粘贴 A、B 和 C 列的值。行序列应该是相同的顺序。如果我为 dat_group 创建新列作为“价格”

dat_group$Price<-NA

那么数据框应该是这样的;

   Group Price
1      A    21
2      A    21
3      A    21
4      A    21
5      A    15
6      A    15
7      A    15
8      A    20
9      A    20
10     A    20
11     C    24
12     C    24
13     C    24
14     C    24
15     C    10
16     C    10
17     C    10
18     C    55
19     C    55
20     C    55
21     B    45
22     B    45
23     B    45
24     B    45
25     B    11
26     B    11
27     B    11
28     B    13
29     B    13
30     B    13 

我尝试使用一些可用的示例 e.g.1 e.g.2 来做到这一点,但没有成功。

请任何人帮助我。可以通过以下代码访问两个示例数据帧。我的实际数据集有几 1000 行。

      dat_group<- structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B", "C"), class = "factor")), .Names = "Group", class = "data.frame", row.names = c(NA, 
-30L))

    dat_price<-structure(list(A = c(21L, 21L, 21L, 21L, 15L, 15L, 15L, 20L, 
20L, 20L), B = c(45L, 45L, 45L, 45L, 11L, 11L, 11L, 13L, 13L, 
13L), C = c(24L, 24L, 24L, 24L, 10L, 10L, 10L, 55L, 55L, 55L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -10L))

【问题讨论】:

  • 如果只有 2 个 A 后跟 2 个 Bs 怎么办,以此类推。在这种情况下应该输出什么?或者结果因子的数量是否与dat_price 的行相同?

标签: r merge paste cbind


【解决方案1】:
library(data.table)
dat_price <- as.data.table(dat_price)
dat_price_new <- cbind(dat_price[, c(1,3), with = FALSE], 
                   dat_price[, 2, with = FALSE])
melt(dat_price_new)

【讨论】:

  • 此代码不适用于我的实际数据集,因为我的实际数据集中的级别出现超过 50 次。
【解决方案2】:

为您手头的问题提供更具防御性的解决方案。希望即使您的所有因子水平都不是相同的倍数,这也能奏效。

library(dplyr); library(purrr); library(magrittr)

dat_group$original_order <- seq(1:nrow(dat_group))

dat_group %<>%
    split(.$Group) %>%
    map(~ mutate(., Price =  rep(na.omit(dat_price[,unique(Group)]), n()/length(na.omit(dat_price[,unique(Group)]))))) %>%
    bind_rows() %>%
    arrange(original_order) %>% 
    select(-original_order)

dat_group

   Group Price
1      A    21
2      A    21
3      A    21
4      A    21
5      A    15
6      A    15
7      A    15
8      A    20
9      A    20
10     A    20
11     C    24
12     C    24
13     C    24
14     C    24
15     C    10
16     C    10
17     C    10
18     C    55
19     C    55
20     C    55
21     B    45
22     B    45
23     B    45
24     B    45
25     B    11
26     B    11
27     B    11
28     B    13
29     B    13
30     B    13

原始(惰性)解决方案:

dat_group$Price <- rep(unlist(dat_price), length.out = nrow(dat_group))

【讨论】:

  • 虽然这可以解决示例,但不难看出您没有解决潜在的挑战。这个解决方案很幸运,因为 A 后面总是跟着 B。
  • @Nathan Day:谢谢,我想知道为什么行序列不适用于我的数据。
  • 这并不能确定因素的相关水平。
  • 由于某种原因,这个答案也不适用于我的实际数据集。实际上它不会创建带有值的列(价格)。
  • 它创建了新列,但它再次没有正确识别级别。比如level C,得到level B的相关序列。
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2016-08-07
  • 2021-04-11
  • 2017-10-25
  • 2021-03-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多