我在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值的数据帧合并。
很抱歉,如果这篇帖子是重复的,但我没有发现任何我可以告诉别人的问题。 -谢谢!
答案 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创建