【发布时间】:2017-06-22 15:23:11
【问题描述】:
假设我将超市水果库存调查的结果存储在数据框中:
stock <- data.frame(
store = c("Asda", "Booths", "Co-op"),
apple = c(1, 0, 0),
banana = c(1, 1, 0),
coconut = c(0, 0, 0)
)
看起来像
store apple banana coconut
1 Asda 1 1 0
2 Booths 0 1 0
3 Co-op 0 0 0
我的目标:
我想将上面的二进制调查结果列转换为每个超市的库存摘要的字符向量,如下所示:
store fruits
1 Asda apple, banana
2 Booths banana
3 Co-op
我的解决方案:
第 1 步:我使用for 循环将二进制列中的所有 1 替换为相应的列名:
for(i in names(stock)[2:4]) {
stock[which(stock[[i]] == 1), i] <- i
}
得到了
store apple banana coconut
1 Asda apple banana 0
2 Booths 0 banana 0
3 Co-op 0 0 0
第 2 步:我使用 tidyr::unite() 将各个水果列连接成一个字符向量列:
library(tidyverse)
stock <- unite(stock, fruits, apple:coconut, sep = ", ")
给我
store fruits
1 Asda apple, banana, 0
2 Booths 0, banana, 0
3 Co-op 0, 0, 0
第 3 步:我必须使用 stringr::str_replace_all() 来删除所有不需要的 0 和逗号分隔符:
library(stringr)
stock$fruits <- str_replace_all(stock$fruits, "0, |, 0|0", "")
虽然这可以获得我想要的结果,但我发现我的解决方案相当笨拙,尤其是循环部分。有人可以与我分享一个更有效和更直接的解决方案吗?非常感谢!
【问题讨论】:
标签: r dataframe character binary-data tidyverse