Разделить столбец на разделитель в фрейме данных [дубликат]
этот вопрос уже есть ответ здесь:
Я хотел бы разделить один столбец на два в пределах фрейма данных на основе разделителя. Например,
a|b
b|c
стать
a b
b c
в рамках данных рамка.
спасибо!
6 ответов:
@Taesung шин прав, но тогда просто еще немного магии, чтобы сделать его в
data.frame. Я добавил строку "x|y", чтобы избежать двусмысленностей:df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) foo <- data.frame(do.call('rbind', strsplit(as.character(df$FOO),'|',fixed=TRUE)))или, если вы хотите заменить столбцы в существующих данных.кадр:
within(df, FOO<-data.frame(do.call('rbind', strsplit(as.character(FOO), '|', fixed=TRUE))))что производит:
ID FOO.X1 FOO.X2 1 11 a b 2 12 b c 3 13 x y
Хэдли имеет очень элегантное решение, чтобы сделать это внутри фреймов данных в его
reshapeпакета, используя функциюcolsplit.require(reshape) > df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) > df ID FOO 1 11 a|b 2 12 b|c 3 13 x|y > df = transform(df, FOO = colsplit(FOO, split = "\|", names = c('a', 'b'))) > df ID FOO.a FOO.b 1 11 a b 2 12 b c 3 13 x y
недавно популярный
tidyrпакета сseparate. Он использует регулярные выражения, так что вам придется бежать|df <- data.frame(ID=11:13, FOO=c('a|b', 'b|c', 'x|y')) separate(data = df, col = FOO, into = c("left", "right"), sep = "\|") ID left right 1 11 a b 2 12 b c 3 13 x yхотя в этом случае значения по умолчанию достаточно умны для работы (он ищет не буквенно-цифровые символы для разделения).
separate(data = df, col = FOO, into = c("left", "right"))
просто наткнулся на этот вопрос, как он был связан в в последнее время вопрос о так.
бесстыдная вилка ответа: используйте
cSplitиз моего "пакета splitstackshape":df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) library(splitstackshape) cSplit(df, "FOO", "|") # ID FOO_1 FOO_2 # 1 11 a b # 2 12 b c # 3 13 x yэта конкретная функция также обрабатывает разделение нескольких столбцов, даже если каждый столбец имеет другой разделитель:
df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'), BAR = c("A*B", "B*C", "C*D")) cSplit(df, c("FOO", "BAR"), c("|", "*")) # ID FOO_1 FOO_2 BAR_1 BAR_2 # 1 11 a b A B # 2 12 b c B C # 3 13 x y C D
по сути, это причудливая удобная обертка для использованиябазовый подход R может быть:read.table(text = some_character_vector, sep = some_sep)и привязка этого вывода к оригиналуdata.frame. Другими словами, Еще одинdf <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) cbind(df, read.table(text = as.character(df$FOO), sep = "|")) ID FOO V1 V2 1 11 a|b a b 2 12 b|c b c 3 13 x|y x y
объединение ответов @Ramnath и @Tommy's позволило мне найти подход, который работает в базе R для одного или нескольких столбцов.
основное использование:
> df = data.frame( + id=1:3, foo=c('a|b','b|c','c|d'), + bar=c('p|q', 'r|s', 's|t'), stringsAsFactors=F) > transform(df, test=do.call(rbind, strsplit(foo, '|', fixed=TRUE)), stringsAsFactors=F) id foo bar test.1 test.2 1 1 a|b p|q a b 2 2 b|c r|s b c 3 3 c|d s|t c dнесколько столбцов:
> transform(df, lapply(list(foo,bar), + function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F) id foo bar X1 X2 X1.1 X2.1 1 1 a|b p|q a b p q 2 2 b|c r|s b c r s 3 3 c|d s|t c d s tлучше именование нескольких разделенных столбцов:
> transform(df, lapply({l<-list(foo,bar);names(l)=c('foo','bar');l}, + function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F) id foo bar foo.1 foo.2 bar.1 bar.2 1 1 a|b p|q a b p q 2 2 b|c r|s b c r s 3 3 c|d s|t c d s t
Comments