R如何';价差';没有键值对的数据
我有以下数据:R如何';价差';没有键值对的数据,r,tidyr,R,Tidyr,我有以下数据: rowID incidentID participant.type 1 1 A 2 1 B 3 2 A 4 3 A 5 3 B 6 3 C 7 4
rowID incidentID participant.type
1 1 A
2 1 B
3 2 A
4 3 A
5 3 B
6 3 C
7 4 B
8 4 C
最后,我想说:
rowID incident participant.type participant.type.1 participant.type.2
1 1 A B
2 2 A
3 3 A B C
4 4 B C
我尝试了传播,但无法实现每次事件一行;我认为我没有办法创建键值对,所以我想知道是否有其他方法可以做到这一点。以下是我的解决方案:
df %>%
select(-rowID) %>%
group_by(incidentID) %>%
nest() %>%
mutate(data = map_chr(data, ~str_c(.x$participant.type, collapse = '_'))) %>%
separate(data, paste0('participant.type.', 0:2)) %>%
mutate_at(2:4, ~replace_na(.x, ''))
我们可以为此使用
reformae2::dcast
reshape2::dcast(df, insidentID ~ participant.type)
# insidentID A B C
# 1 1 <NA> B <NA>
# 2 8 <NA> B <NA>
# 3 12 <NA> <NA> C
# 4 16 A <NA> <NA>
# 5 24 <NA> B <NA>
# 6 27 <NA> B C
# 7 29 <NA> <NA> C
重塑2::dcast(df,insidentID~participant.type)
#内幕交易
#11b
#2.8 B
#3 12 C
#4 16 A
#5 24B
#6 27 B C
#7 29 C
用数据
set.seed(123)
df <- data.frame(insidentID = sample(0:30, 8L, replace = TRUE),
participant.type = sample(LETTERS[1:3], 8L, replace = TRUE),
stringsAsFactors = FALSE)
df
# insidentID participant.type
# 1 8 B
# 2 24 B
# 3 12 C
# 4 27 B
# 5 29 C
# 6 1 B
# 7 16 A
# 8 27 C
set.seed(123)
df在使用spread()
之前,您需要创建一个正确的键
参数
df %>% select(-rowID) %>%
group_by(incidentID) %>%
mutate(id = 1:n()) %>%
spread(id, participant.type)
# incidentID `1` `2` `3`
# <int> <fct> <fct> <fct>
# 1 1 A B NA
# 2 2 A NA NA
# 3 3 A B C
# 4 4 B C NA
df%>%select(-rowID)%>%
分组依据(包括)%>%
变异(id=1:n())%>%
排列(id,参与者类型)
#包含'1``2``3`
#
#1 A B NA
#2 A NA NA
#3 A B C
#4 B C NA
由@markus提供的“相关问题”链接显示了多种其他解决方案,包括最简洁的tidyverse格式:
df %>%
group_by(incidentID) %>%
mutate(rn = paste0("newcolumn",row_number())) %>%
spread(rn, participant.type)
给出:
incidentID newcolumn1 newcolumn2 newcolumn3
<int> <fct> <fct> <fct>
1 1 A B NA
2 2 A NA NA
3 3 A B C
4 4 B C NA
包含新列1新列2新列3
1 A B NA
2 A NA NA
3 A B C
4 B C NA
A,因为您的分组是基于IcintId列中的行顺序。以下简单的解决方案也将起作用
它只是过滤数据帧,然后最终合并
就有效利用计算能力而言,这可能不是最好的解决方案,但它很容易理解
library(tidyverse)
df <-
tribble(
~rowID, ~incidentID, ~participant.type,
1, 1, "A",
2, 1, "B",
3, 2, "A",
4, 3, "A",
5, 3, "B",
6, 3, "C",
7, 4, "B",
8, 4, "C")
df_1 <- df %>%
select(-rowID) %>%
group_by(incidentID) %>%
filter(row_number()==1)
df_2 <- df %>%
select(-rowID) %>%
group_by(incidentID) %>%
filter(row_number()==2) %>%
rename(participant.type.1 = participant.type)
df_3 <- df %>%
select(-rowID) %>%
group_by(incidentID) %>%
filter(row_number()==3) %>%
rename(participant.type.2 = participant.type)
full_join(df_1, full_join(df_2, df_3))
库(tidyverse)
df%
分组依据(包括)%>%
过滤器(行数()==1)
df_2%
选择(-rowID)%%>%
分组依据(包括)%>%
过滤器(行号()==2)%>%
重命名(participant.type.1=participant.type)
df_3%
选择(-rowID)%%>%
分组依据(包括)%>%
过滤器(行数()==3)%>%
重命名(participant.type.2=participant.type)
全连接(df_1,全连接(df_2,df_3))
结果:
Joining, by = "incidentID"
Joining, by = "incidentID"
# A tibble: 4 x 4
# Groups: incidentID [?]
incidentID participant.type participant.type.1 participant.type.2
<dbl> <chr> <chr> <chr>
1 1 A B NA
2 2 A NA NA
3 3 A B C
4 4 B C NA
通过=“incidentID”连接
通过=“incidentID”连接
#一个tibble:4x4
#组:包含[?]
incidentID participant.type participant.type.1 participant.type.2
1 A B NA
2 A NA NA
3 A B C
4 B C NA
第四行应该是A
,而不是bc
。是的,谢谢,相关链接提供了几种解决方案,我在下面添加了其中一种作为答案,谢谢如果不删除变量rowID
,输出将不会是上面显示的结果。你的答案和我的一样。你不必再发了。我感谢你的帮助,我想我是在看到你的链接之前根据链接发了代码的。我把你的标为解决方案。这是最好的解决方案。