R数据帧,将一列除以另一列中的值

时间:2018-11-28 18:38:32

标签: r dataframe

我在R中有一个类似于以下内容的数据框:

UPDATE #NDD  
SET #NDD.[2018-07-31] = mh.NextDueDate 
FROM #MARS_history as mh
WHERE mh.Account = #NDD.Account

SELECT * FROM #NDD

假设所有列均包含因子而不是字符串或整数,那么如何将单列“ C”转换为与B中的值相对应的多个列?

我想要看起来像下面的东西,无论是否在数据框中保留B / C列。

A    B     C

A    X     1   
A    Y     3   
A    Z     3
A    Z     2

理想情况下,我希望最终输出是R中的一个数据帧,因为我打算将其与另一个具有匹配值A值的数据帧合并。

很抱歉,如果这篇帖子是重复的,但我没有发现任何我可以告诉别人的问题。 -谢谢!

2 个答案:

答案 0 :(得分:0)

我们可以使用dcast中的data.table将'C'列转换为'wide',然后将cbind转换为原始数据集

library(data.table)
cbind(df1, dcast(setDT(df1), seq_len(nrow(df1))~ B,
           value.var = 'C')[, -1, with = FALSE])
#    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

数据

df1 <- structure(list(A = c("A", "A", "A", "A"), B = c("X", "Y", "Z", 
 "Z"), C = c(1L, 3L, 3L, 2L)), class = "data.frame", row.names = c(NA, 
 -4L))

答案 1 :(得分:0)

我承认有两种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

您可以执行此操作,然后将此列绑定到原始数​​据帧,但是您的列将乱序,并且您将拥有与列A1相同的列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 package(v0.2.1)于2018-11-28创建

相关问题