首页 > 解决方案 > 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 值的数据框合并。

抱歉,如果这篇文章是重复的,但我没有发现任何我可以告诉有人在问同样事情的地方。- 谢谢!

标签: rdataframe

解决方案


这里有两种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 日创建


推荐阅读