【问题标题】:R dataframes: find data in one data.frame and add it into other data.frame at a particular locationR dataframes:在一个data.frame中查找数据并将其添加到特定位置的其他data.frame中
【发布时间】:2018-04-04 02:36:40
【问题描述】:
segment1<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
segment2<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
rating  <-c(1,1,2,2,1,3,1,1,2,2,3,2,2,2,1,1,2,3,3,1,1,2,3,2)

data<-data.frame(segment1,segment2,rating)

df1<-aggregate(
    x = data.frame(list("count"=data$rating)),
    by = data.frame(list("segment1"=data$segment1, "segment2"=data$segment2, "rating"=data$rating)),
    FUN = length
)

df2<-aggregate(
    x = data.frame(list("count"=df1$count)),
    by = data.frame(list("segment1"=df1$segment1, "segment2"=df1$segment2)),
    FUN = sum
)

df2$rating1<-0
df2$rating2<-0
df2$rating3<-0

df1

分段 1 分段 2 评分计数 1 1 1 1 6 2 1 2 1 3 3 1 1 2 7 4 1 2 2 3 5 1 1 3 2 6 1 2 3 3

df2

分段 1 分段 2 计数 评分 1 评分 2 评分 3 1 1 1 15 0 0 0 2 1 2 9 0 0 0

我需要 df2 的这个输出

分段 1 分段 2 计数 评分 1 评分 2 评分 3 1 1 1 15 6 7 2 2 1 2 9 3 3 3

【问题讨论】:

  • 分数和平均值是如何计算的?为rating_x 列更新您想要的输出也是一个好主意,让我们更好地了解您想要什么。
  • 请在此处了解如何正确提问。帮助我们为您提供帮助。
  • 请以更容易读入 R 的格式提供您的示例数据,例如使用dput(),阅读here 如何改进您的问题。
  • 如果您的数据集比您的示例大(即,segment1 具有不同的值),此解决方案肯定需要修改,但是,使用 df2$rating1 = df1[df1$rating==1,]$countdf2$rating2 = df1[df1$rating==2,]$countdf2$rating3 = df1[df1$rating==3,]$count 会产生您的输出想要。

标签: r function dataframe aggregate


【解决方案1】:

您只需使用group_by/summarize 组合即可完成此操作。您不需要创建任何中间数据框并加入它们。代码如下:

data %>% 
  group_by(segment1, segment2) %>%
  summarize(
    count = n(),
    rating1 = sum(rating == 1),
    rating2 = sum(rating == 2),
    rating3 = sum(rating == 3)
  )

这给了你这个:

# A tibble: 2 x 6
# Groups:   segment1 [?]
  segment1 segment2 count rating1 rating2 rating3
     <dbl>    <dbl> <int>   <int>   <int>   <int>
1        1        1    15       6       7       2
2        1        2     9       3       3       3

【讨论】:

    【解决方案2】:

    我的输入与您获得相同的数据框:
    (也许发布您聚合第一个数据帧以获得第二个数据帧的方式)

       > df1 <- read.table(text ="segment1 segment2 rating count
                             1         1        1      1 1415
                             2         2        2      1 272
                             3         1        1      2 1970
                             4         2        2      2 363
                             5         1        1      3 8484
                             6         2        2      3 1465
                             7         1        1      4 33619
                             8         2        2      4 5332
                             9         1        1      5 58173
                             0         2        2      5 12031",header=T)
        > df2 <- read.table(text =" segment1  segment2    score    count   avg rating_1 rating_2 rating_3 rating_4 rating_5
                             1        1         1   456148   103661   4.4        0        0        0        0        0
                             2        2         2    86876    19463   4.5        0        0        0        0        0",header=T)
        > df2
        segment1 segment2  score  count avg rating_1 rating_2 rating_3 rating_4 rating_5
        1        1        1 456148 103661 4.4        0        0        0        0        0
        2        2        2  86876  19463 4.5        0        0        0        0        0
    

    我的脚本可能不是最好看的,但只有当segment1==segment2==segment3...时,它才适用于任意数量的段...(就像您提供的示例一样,总是这样吗??? )

       > n_seg=2 # number of segments
         n_rat=5 # number of ratings
         for(i in 1:n_seg) # segment
          {
          for(j in 1:n_rat) # rating
            {
            df2[i,5+j]=df2[i,5+j]+df1$count[df1$segment1==i & df1$rating==j]
            }
          }
    

    我的输出:

    > df2
      segment1 segment2  score  count avg rating_1 rating_2 rating_3 rating_4 rating_5
    1        1        1 456148 103661 4.4     1415     1970     8484    33619    58173
    2        2        2  86876  19463 4.5      272      363     1465     5332    12031
    

    【讨论】:

      【解决方案3】:

      也许这对你有用

      library(dplyr)
      library(tidyr)
      
      df3 <- df2 %>%
               select(segment1, segment2, count)
      
      df3
        # segment1 segment2 count
      # 1        1        1    15
      # 2        1        2     9
      
      
      df1 %>%
        mutate(rating = paste0("rating", rating)) %>%
        spread(rating, count) %>%
        left_join(., df3, by=c("segment1", "segment2")) %>%
        select(segment1, segment2, count, rating1, rating2, rating3)
        # segment1 segment2 count rating1 rating2 rating3
      # 1        1        1    15       6       7       2
      # 2        1        2     9       3       3       3
      

      保存答案

      ans <- df1 %>%
              mutate(rating = paste0("rating", rating)) %>%
              spread(rating, count) %>%
              left_join(., df3, by=c("segment1", "segment2")) %>%
              select(segment1, segment2, count, rating1, rating2, rating3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-16
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        相关资源
        最近更新 更多