Сложная проблема в R. Разделить символьную строку набора данных, но сохранить информацию в других столбцах - PullRequest
2 голосов
/ 08 июля 2010

Я использую R. Возьмите набор данных, который я создал ниже для примера. Я хочу иметь возможность отделить ip от ".", сохраняя при этом исходную информацию о строках в color и status. Я понимаю, что это создаст более длинный набор данных, в котором записи для color и status будут повторяться.

a <- data.frame(cbind(color=c("yellow","red","blue","red"),
       status=c("no","yes","yes","no"),
       ip=c("162.131.58.26","2.131.58.16","2.2.58.10","162.131.58.17")))

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Непонятно, нужен ли ОП новые строки или столбцы, поэтому вот оба:

столбцы:

library(reshape)
a <- data.frame(a, colsplit(a$ip, split = "\\.", names = c("foo", "bar", "baz", "phi")))

или строки (после добавления столбцов выше)

a.m <- melt(a, id.vars = c("color", "status", "ip"))
0 голосов
/ 08 марта 2011
# give a an id to match cases
a$id <- 1:nrow(a)

# split the ip address and store in datab
datab <- unlist(strsplit(as.character(a$ip),"\\."))

# put the parts of the ip address against the correct ids in a new dataframe
datac <- data.frame(id=sort(rep(1:4,nrow(a))),ip=datab)

# merge the data together, remove unwanted variables, correct column name
final <- merge(datac,a,by="id")
final <- final[c("ip.x","color","status")]
colnames(final)[1] <- "ip"

Это даст вам каждую часть IP-адреса в новой строке с повторением переменных цвета и состояния. Я надеюсь, что это то, что вы были после. В противном случае предыдущий ответ выглядит неплохо, когда данные ip идут в столбцы, а не в строки.

0 голосов
/ 29 января 2011
a <- cbind(a[,1:2], t(matrix(as.numeric(unlist(strsplit(as.character(a[,3]), "\\."))), nrow = nrow(a), ncol = 4)))

Не уверен, что это то, что вы хотите, и я уверен, что есть более приятный способ сделать это, даже если это то, что вы хотите.

...