Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R如何';价差';没有键值对的数据_R_Tidyr - Fatal编程技术网

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
,输出将不会是上面显示的结果。你的答案和我的一样。你不必再发了。我感谢你的帮助,我想我是在看到你的链接之前根据链接发了代码的。我把你的标为解决方案。这是最好的解决方案。