连接数据框中的列

时间:2018-02-15 10:24:10

标签: r

我们在列/变量中有品牌数据,由分号(;)分隔。我们的任务是将这些列数据拆分为多个列,我们可以使用以下语法进行操作。

将数据附加为屏幕截图。 Data set

这是R代码:

x<-dataset$Pref_All
point<-df %>% separate(x, c("Pref_01","Pref_02","Pref_03","Pref_04","Pref_05"), ";")
point[is.na(point)] <- ""

但是我们的问题是:我们有超过10到15列的此类品牌数据,如果我们使用上述语法,则要分割的最大列数取决于每列所拥有的品牌数量(我们手动计算并取为5列)。 我们想知道有没有什么方法可以用动态的方式编写代码,这样它就可以计算出每个列所拥有的最大品牌数量,因此它应该在数据框中创建那么多新的列。例如 Pref_01,Pref_02,Pref_03,Pref_04,Pref_05。

首选输出以屏幕截图显示。 Output

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

x&lt; - c(“Swift; Baleno; Ciaz; Scross; Brezza”,“Baleno; swift; celerio; ignis”,“Scross; Baleno; celerio; brezza”,“”,“Ciaz; Scross; Brezza “)

strsplit(X, “;”)

答案 1 :(得分:0)

library(dplyr)
library(tidyr)
x <- data.frame(ID = c(1,2,3,4,5),
                Pref_All = c("S;B;C;S;B",
                             "B;S;C;I",
                             "S;B;C;B",
                             " ",
                             "C;S;B"))
x$Pref_All <- as.character(levels(x$Pref_All))[x$Pref_All]
final_df <- x %>%
        tidyr::separate(Pref_All, c(paste0("Pref_0", 1:b[[which.max(b)]])), ";")
final_df$ID <- x$Pref_All
final_df <- rename(final_df, Pref_All = ID)
final_df[is.na(final_df)] <- ""


   Pref_All Pref_01 Pref_02 Pref_03 Pref_04 Pref_05
1 S;B;C;S;B       S       B       C       S       B
2   B;S;C;I       B       S       C       I        
3   S;B;C;B       S       B       C       B        
4                                                  
5     C;S;B       C       S       B                

列名称的技巧由paste0给出,从1到数据中的最大品牌数量!

答案 2 :(得分:0)

我会使用str_split()返回一个字符向量列表。从那里,我们可以在数据框中计算出最大数量的首选项,然后在其上应用一个函数来添加缺少的元素。

df=data.frame("id"=1:5, 
          "Pref_All"=c("brand1", "brand1;brand2;brand3", "", "brand2;brand4", "brand5"))

spl = str_split(df$Pref_All, ";")
# Find the max number of preferences
maxl = max(unlist(lapply(spl, length)))
# Add missing values to each element of the list
spl = lapply(spl, function(x){c(x, rep("", maxl-length(x)))})
# Bind each element of the list in a data.frame
dfr = data.frame(do.call(rbind, spl))
# Rename the columns
names(dfr) = paste0("Pref_", 1:maxl)
print(dfr)

#    Pref_1    Pref_2    Pref_3
#1   brand1              
#2   brand1    brand2    brand3
#3                     
#4   brand2    brand4       
#5   brand5