r - R数据框,将一列除以另一列中的值
问题描述
我在 R 中有一个类似于以下内容的数据框:
A B C
A X 1
A Y 3
A Z 3
A Z 2
鉴于所有列都包含因子而不是字符串或整数,我如何将单列“C”转换为与它们在 B 中的值相对应的多列?
我想要看起来像下面的东西,无论 B/C 列是否仍在数据框中。
A B C X Y Z
A X 1 1 NA NA
A Y 3 NA 3 NA
A Z 3 NA NA 3
A Z 2 NA NA 2
理想情况下,我希望我的最终输出是 R 中的一个数据框,因为我打算将它与另一个具有匹配值 A 值的数据框合并。
抱歉,如果这篇文章是重复的,但我没有发现任何我可以告诉有人在问同样事情的地方。- 谢谢!
解决方案
这里有两种tidyverse
我承认有点笨拙的方法。它们都利用tidyr::spread
来获取宽形数据,然后将宽版本绑定回原始数据。
library(tidyr)
library(dplyr)
要使用spread
,您首先需要对每一行进行某种标识。一个快速的方法是使用tibble::rowid_to_column
.
df %>%
tibble::rowid_to_column() %>%
spread(key = B, value = C)
#> rowid A X Y Z
#> 1 1 A 1 NA NA
#> 2 2 A NA 3 NA
#> 3 3 A NA NA 3
#> 4 4 A NA NA 2
您可以这样做,然后将其列绑定到原始数据框,但是您的列将无序,并且您将拥有与 columnA1
相同的列A
。使用select
,您可以按正确的顺序选择所需的列。
df %>%
tibble::rowid_to_column() %>%
spread(key = B, value = C) %>%
bind_cols(df) %>%
select(A, B, C, X, Y, Z)
#> A B C X Y Z
#> 1 A X 1 1 NA NA
#> 2 A Y 3 NA 3 NA
#> 3 A Z 3 NA NA 3
#> 4 A Z 2 NA NA 2
更好的是在spread
列绑定中执行操作,然后删除 2 个无关的列。
bind_cols(
df,
df %>% tibble::rowid_to_column() %>% spread(key = B, value = C)
) %>%
select(-rowid, -A1)
#> A B C X Y Z
#> 1 A X 1 1 NA NA
#> 2 A Y 3 NA 3 NA
#> 3 A Z 3 NA NA 3
#> 4 A Z 2 NA NA 2
由reprex 包(v0.2.1)于 2018 年 11 月 28 日创建
推荐阅读
- android - Android - 在完成第一个活动之前打开另一个活动时未调用 onActivityResult
- python - 如何将 message.text 转换为字符串并将其保存到数据库。如何通过电报机器人下载照片。TelegramBotAPI
- flutter - Flutter:如何调用存储在变量中的类
- autodesk-forge - How to receive the RealityCapture results on an email address
- javascript - 当值 <0 时需要红色的进度条
- svg - 使用 imagemagick 从带有覆盖文本的 SVG 创建 PNG 图标
- flutter - 如何存根不属于类的函数
- flutter - Flutter - 无法在文本字段中编辑文本而不点击它
- css - CSS 右侧的 div 弯曲(提供的示例图片)
- c++ - 如何使用 stbi_load 从 cairo_image_surface_create_for_data 渲染图像?