我有一个数据集,其中的列包含代码+名称的信息,我想将其分为两列。所以,举个例子:
E5000_A列包含类似于`0080002的值。ALB-民主党'在一个单元格中,我想要两列,一列包含代码0080002,另一列包含其他信息。
我还有8列的值非常相似(E5000_A到E5000_H(。这是我正在写的代码。
cols2 <- c("E5000_A" , "E5000_B" , "E5000_C" , "E5000_D" ,
"E5000_E" , "E5000_F" , "E5000_G" , "E5000_H" )
for(i in cols2){
cses_imd_m <- cses_imd_m %>% mutate(substr(i, 1L, 7L))
}
但由于某种原因,它只为E5000_a生成了一个新列,循环不会转到其他变量。我做错了什么?如果您需要有关代码或数据框架的更多详细信息,请告诉我。
data.frame
进近
# to extract codes
df %>%
mutate_at(.vars = vars(c("E5000_A", "E5000_B", "E5000_C", "E5000_D", "E5000_E",
"E5000_F", "E5000_G", "E5000_H")),
.funs = function(x) str_extract("^\d+", x))
您也可以在mutate()
中使用across()
。
如果您想使用for
环路
col_names <- c("E5000_A", "E5000_B", "E5000_C", "E5000_D", "E5000_E", "E5000_F", "E5000_G", "E5000_H")
for (i in col_names) {
df[,sprintf("code_%s", i)] <- str_extract("^\d+", df[,i])
df[,sprintf("party_%s", i)] <- gsub(".*\.", "", df[,i]) %>% str_trim() # remove all before dot (.)
}