R 如果列不同,则按其字符串分隔列

R 如果列不同,则按其字符串分隔列,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个数据框,如果它们包含不同的字符串或单词,我想显示它们的列 我在R中尝试不同的方法,但它不起作用 我的数据框如下所示: df <- data.frame(x = c(NA, "TAP1", "TAP1", "TAP2"), y = c("TAP1", "TAP2", "TAP2", "TAP3" )) df我们可以通过spread library(tidyverse) df %>% mutate(n = row_number()) %>% group_b

我有一个数据框,如果它们包含不同的字符串或单词,我想显示它们的列

我在R中尝试不同的方法,但它不起作用

我的数据框如下所示:

df <- data.frame(x = c(NA, "TAP1", "TAP1", "TAP2"), y = c("TAP1", "TAP2", "TAP2", "TAP3" ))

df我们可以通过
spread

library(tidyverse)
df %>% 
   mutate(n = row_number()) %>% 
   group_by(x) %>% 
   mutate(rn = row_number(), y = x) %>%
   spread(y, x) %>% 
   select(TAP1, TAP2)
# A tibble: 4 x 2
#  TAP1  TAP2 
#  <fct> <fct>
#1 <NA>  <NA> 
#2 TAP1  <NA> 
#3 TAP1  <NA> 
#4 <NA>  TAP2 
rownames_to_column(df, 'rn') %>%
   gather(key, val, -rn) %>%
   mutate(val1 = val) %>% 
   unite(val, val,key) %>% 
   group_by(val) %>%    # not really need for this example
   mutate(ind = row_number()) %>% # not needed here though
   spread(val, val1) %>%
   select(starts_with("TAP"))
# A tibble: 4 x 5
# TAP1_x TAP1_y TAP2_x TAP2_y TAP3_y
#  <chr>  <chr>  <chr>  <chr>  <chr> 
#1 <NA>   TAP1   <NA>   <NA>   <NA>  
#2 TAP1   <NA>   <NA>   TAP2   <NA>  
#3 TAP1   <NA>   <NA>   TAP2   <NA>  
#4 <NA>   <NA>   TAP2   <NA>   TAP3  

这是一个基本的解决方案。这将检查列中所有可能的因素(即,
TAP1
TAP2
),并检查它们所在的位置。对于它们存在的位置,它将返回级别的名称。对于它们不存在的地方,它返回
NA
。然后,我将结果列表重新打包到数据框中,并重命名列

#原始数据帧
df 2 TAP1
#>3 TAP1
#>4 TAP2
由(v0.3.0)于2019-05-29创建


根据您的更新:

#原始数据帧
df 3 TAP1 TAP2
#>4 TAP2 TAP3
由(v0.3.0)于2019-05-29创建


原理与之前相同,但我定义了一个应用于每个列的函数,并使用
do.call
cbind
将结果绑定在一起,这是一个使用
tidyverse
dummies
包的解决方案
df3
是最终输出

library(tidyverse)
library(dummies)

df2 <- dummy.data.frame(df) %>% select(-ends_with("NA"))

cols <- str_remove(names(df2), regex("^x|^y"))

df3 <- modify2(df2, cols, ~ifelse(.x == 0, NA, .y))

df3
#   xTAP1 xTAP2 yTAP1 yTAP2 yTAP3
# 1  <NA>  <NA>  TAP1  <NA>  <NA>
# 2  TAP1  <NA>  <NA>  TAP2  <NA>
# 3  TAP1  <NA>  <NA>  TAP2  <NA>
# 4  <NA>  TAP2  <NA>  <NA>  TAP3
库(tidyverse)
图书馆(傻瓜)
df2%选择(-以“NA”结尾)

cols第一个datasetMy expected output的预期输出显示在按钮处,每个字符串有一列。第一列中的TAP1和第二列中的TAP2。对于Colu“y”,我想要3列,一列用于TAP1,另一列用于TAP2,另一列用于TAP3。新的输入表是什么谢谢,我在最终预期输出的上方添加了数据框。这并没有为TAP3添加新的列,但非常令人印象深刻,我正在尝试了解逻辑。傻瓜的不错选择
 df <- data.frame(x = c(NA, "TAP1", "TAP1", "TAP2"), y = c("TAP1", "TAP2",   "TAP2", "TAP3" ))

  TAP1 TAP2 TAP1.1 TAP2.2 TAP3.3
1 <NA> <NA> TAP1   <NA>   <NA>
2 TAP1 <NA> <NA>   TAP2   <NA>
3 TAP1 <NA> <NA>   TAP2   <NA>
4 <NA> TAP2 <NA>   <NA>   TAP3
library(tidyverse)
df %>% 
   mutate(n = row_number()) %>% 
   group_by(x) %>% 
   mutate(rn = row_number(), y = x) %>%
   spread(y, x) %>% 
   select(TAP1, TAP2)
# A tibble: 4 x 2
#  TAP1  TAP2 
#  <fct> <fct>
#1 <NA>  <NA> 
#2 TAP1  <NA> 
#3 TAP1  <NA> 
#4 <NA>  TAP2 
rownames_to_column(df, 'rn') %>%
   gather(key, val, -rn) %>%
   mutate(val1 = val) %>% 
   unite(val, val,key) %>% 
   group_by(val) %>%    # not really need for this example
   mutate(ind = row_number()) %>% # not needed here though
   spread(val, val1) %>%
   select(starts_with("TAP"))
# A tibble: 4 x 5
# TAP1_x TAP1_y TAP2_x TAP2_y TAP3_y
#  <chr>  <chr>  <chr>  <chr>  <chr> 
#1 <NA>   TAP1   <NA>   <NA>   <NA>  
#2 TAP1   <NA>   <NA>   TAP2   <NA>  
#3 TAP1   <NA>   <NA>   TAP2   <NA>  
#4 <NA>   <NA>   TAP2   <NA>   TAP3  
library(tidyverse)
library(dummies)

df2 <- dummy.data.frame(df) %>% select(-ends_with("NA"))

cols <- str_remove(names(df2), regex("^x|^y"))

df3 <- modify2(df2, cols, ~ifelse(.x == 0, NA, .y))

df3
#   xTAP1 xTAP2 yTAP1 yTAP2 yTAP3
# 1  <NA>  <NA>  TAP1  <NA>  <NA>
# 2  TAP1  <NA>  <NA>  TAP2  <NA>
# 3  TAP1  <NA>  <NA>  TAP2  <NA>
# 4  <NA>  TAP2  <NA>  <NA>  TAP3