首页 > 解决方案 > 如何将某些行移动到 R 中的列?

问题描述

所以我正在做一个数据科学项目,但后来遇到了一个问题。
下面是我的数据集的一个例子。让我简要介绍一下。(请理解为向您展示 Excel 中的数据集,因为我在 RStudio 上的数据集有点凌乱,并且其中还有一些韩文字母。

“FoodCode”是主题(ID)过去吃过的食物的代码24 小时。
所以你可以看到对象 ID 1 在过去 24 小时内吃了四种不同的食物。“摄入量”是对象吃的某种食物的量。“总摄入量
”显然是总量,每个受试者所有食物摄入量的总和。
“比例”只是“摄入量”/“总摄入量”。

在此处输入图像描述


现在,我想转换具有“ID”、“FoodCode A 的比例”、“FoodCode B 的比例”等的数据集。(有 20 种不同的食品代码)。当然,这次行中不会有重叠的 ID。

非常感谢您的帮助。谢谢。:)

标签: r

解决方案


我在这里猜测您的目标是什么,因为您的问题不容易正确解释。这是我对它的阅读:

library(dplyr)
library(tidyr)
library(tibble)

data <- tibble(
  ID = c(1, 1, 1, 1, 2, 2, 2,2),
  FoodCode = c("A", "B", "C", "D", "A", "B", "D", "E"),
  Intake = c(100, 100, 200, 80, 20, 200, 100, 20)
)

data <- data %>%
  group_by(ID) %>%
  mutate(IntakeTotal = sum(Intake)) %>%
  ungroup() %>%
  mutate(Proportion = Intake / IntakeTotal)

summary <- data %>%  
  select(-Intake, -IntakeTotal) %>%
   pivot_wider(values_from = Proportion,
              names_from = FoodCode) 

可以从其他列轻松计算 IntakeTotal 和 Proportion 列。然后我对您想要的内容的阅读是使用该pivot-wider函数将对象重塑为宽格式:

初始对象data

> data
# A tibble: 8 x 3
     ID FoodCode Intake
  <dbl> <chr>     <dbl>
1     1 A           100
2     1 B           100
3     1 C           200
4     1 D            80
5     2 A            20
6     2 B           200
7     2 D           100
8     2 E            20

重新创建 IntakeTotal 和 Proportion 列后:

> data
# A tibble: 8 x 5
     ID FoodCode Intake IntakeTotal Proportion
  <dbl> <chr>     <dbl>       <dbl>      <dbl>
1     1 A           100         480     0.208 
2     1 B           100         480     0.208 
3     1 C           200         480     0.417 
4     1 D            80         480     0.167 
5     2 A            20         340     0.0588
6     2 B           200         340     0.588 
7     2 D           100         340     0.294 
8     2 E            20         340     0.0588

最后在将形状更改为宽格式后。这就是你所追求的吗?

> summary
# A tibble: 2 x 6
     ID      A     B      C     D       E
  <dbl>  <dbl> <dbl>  <dbl> <dbl>   <dbl>
1     1 0.208  0.208  0.417 0.167 NA     
2     2 0.0588 0.588 NA     0.294  0.0588

推荐阅读