R 如果列不同,则按其字符串分隔列
我有一个数据框,如果它们包含不同的字符串或单词,我想显示它们的列 我在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
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