我们在列/变量中有品牌数据,由分号(;)分隔。我们的任务是将这些列数据拆分为多个列,我们可以使用以下语法进行操作。
将数据附加为屏幕截图。 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
感谢您的帮助。
答案 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