2013-11-19 3 views
8

Я искал ответы, но нашел только вещи, относящиеся к C или C#. Я понимаю, что большая часть R написана на C, но мое знание об этом не существует. Я также относительно новичок в R. Я использую текущий Rstudio.Несколько разделителей для одного и того же файла ввода R

Это похоже на то, что я хочу, я думаю. Read the data efficiently with multiple separating lines in R

У меня есть файл CSV, но одна переменная строка со значениями, разделенными _ и - И я хотел бы знать, если есть пакет или дополнительный код, который выполняет следующие действия на чтение. команда.

"1","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",0,218,4,93,1377907200000 
"2","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",0,390,5,157,1377993600000 
"3","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",0,376,5,193,1.37808e+12 
"4","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",1,35,1,15,1377907200000 
"5","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",12,11258,117,2843,1377993600000 
"6","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",5,4659,56,1826,1.37808e+12 
"7","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_ANDROID","2013-08-31 13:39:55.0","2013-10-16 13:58:00.0",7,7296,136,2684,1377907200000 
"8","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_IOS_IPAD","2013-08-31 13:18:21.0","2013-10-16 13:58:00.0",0,4533,35,1632,1377907200000 
"9","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_IOS_IPAD","2013-08-31 13:18:21.0","2013-10-16 13:58:00.0",0,421,6,161,1377993600000 
"10","Client1","Name2","*Name3_Name1_KB_MobApp_M-13-44_AU_PI Likes by KB_IOS_IPAD","2013-08-31 13:18:21.0","2013-10-16 13:58:00.0",0,57,2,23,1.37808e+12 

Пример строки:

Name Name1 *XYZ_Name3_KB_MobApp_M-18-25_AU_PI ANDROID 2013-09-32 14:39:55.0 2013-10-16 13:58:00.0 0 218 4 93 1377907200000 

Так что достаточно легко читать в

results <- read.delim("~/results", header=F) 

но я до сих пор есть строка * XYZ_Name3_KB_MobApp_M-18-25_AU_PI

Желаемая выход (от _ и -):

Name Name1 *XYZ Name3 KB MobApp M 18 25 AU PI ANDROID 2013-09-32 14:39:55.0 2013-10-16 13:58:00.0 0 218 4 93 1377907200000 

, но не разделить строку времени.

---- Спасибо @Henrik и @AnandaMahto за код и пакет. ----

library(splitstackshape) 

# split concatenated column by `_` 
df4 <- concat.split(data = df3, split.col = "V3", sep = "_", drop = TRUE) 

# split the remaining concatenated part by `-` 
df5 <- concat.split(data = df4, split.col = "V3_5", sep = "-", drop = TRUE) 
+0

У меня есть возможность снова экспортировать в CSV-файл, а затем положить в Excel и использование текста в колонки дважды. но, поскольку я нахожусь на excel 2010, это с ограниченным количеством строк. – CArnold

+1

Посмотрите на 'str_split' или' stringr :: str_split_fixed' и посмотрите, поможет ли это. – TheComeOnMan

+0

Ах, так просто. Вы думаете, что я должен сделать это несколько раз? Вместо импорта. – CArnold

ответ

2

Попробуйте это:

# dummy data 
df <- read.table(text=" 
Name Name1 *XYZ_Name3_KB_MobApp_M-18-25_AU_PI ANDROID 2013-09-32 14:39:55.0 2013-10-16 13:58:00.0 0 218 4 93 1377907200000 
Name Name2 *CCC_Name3_KB_MobApp_M-18-25_AU_PI ANDROID 2013-09-32 14:39:55.0 2013-10-16 13:58:00.0 0 218 4 93 1377907200000 
", as.is = TRUE) 

# replace "_" to "-" 
df_V3 <- gsub(pattern="_", replacement="-", df$V3, fixed = TRUE) 

# strsplit, make dataframe 
df_V3 <- do.call(rbind.data.frame, strsplit(df_V3, split = "-")) 

# output, merge columns 
output <- cbind(df[, c(1:2)], 
       df_V3, 
       df[, c(4:ncol(df))]) 

Опираясь на комментарии ниже, вот еще один родственный вариант, но один, который использует read.table вместо strsplit.

splitCol <- "V3" 
temp <- read.table(text = gsub("-", "_", df[, splitCol]), sep = "_") 
names(temp) <- paste(splitCol, seq_along(temp), sep = "_") 
cbind(df[setdiff(names(df), splitCol)], temp) 
+0

@ zx8754, две идеи: (1) Если вы собираетесь использовать подход 'strsplit', используйте регулярное выражение и пропустите шаг' gsub', и, возможно, просто используйте 'do.call (rbind, ...) 'поскольку (I * think *)' rbind.data.frame' медленнее (и это дает вам фанковые имена). (2) Если вы собираетесь использовать подход 'gsub', забудьте о' strsplit' и используйте 'read.table (text = df_V3, sep =" - ")'. – A5C1D2H2I1M1N2O1R2T1

+1

Но +1 для ответа, который должен по крайней мере указывать OP в правильном направлении ;-) – A5C1D2H2I1M1N2O1R2T1

+0

Я бы поднял голову, если бы у меня было достаточно очков репутации. Но, к сожалению, пока нет. – CArnold

4

Я нахожу функции в пакете splitstackshape удобными в таких случаях.

library(splitstackshape) 

# split concatenated column by `_` 
results2 <- concat.split(data = results, split.col = "V3", sep = "_", drop = TRUE) 

# split the remaining concatenated part by `-` 
results3 <- concat.split(data = results2, split.col = "V3_5", sep = "-", drop = TRUE) 
results3 
+0

Я получаю «Ошибка в FUN (NA_integer _ [[1L]], ...): аргумент должен быть принудительным к неотрицательному целому числу ", но спасибо за пакет, который я рассмотрю, чтобы заставить его работать. – CArnold

+0

OK.Возможно, есть некоторые характеристики ваших исходных данных, которые не представлены в небольшой выборке в вашем вопросе (что отлично работает для меня). Приветствия. – Henrik

+1

@ChristianArnold, как автор пакета, мне было бы интересно увидеть некоторые фактические данные, которые создают эту ошибку, и шаги для ее воспроизведения. Не стесняйтесь сделать это, создав проблему в треевом выпуске Github пакета (https://github.com/mrdwab/splitstackshape/issues?state=open). Благодаря! – A5C1D2H2I1M1N2O1R2T1

1
library(stringr) 

results <- read.delim("~/results", header=F) 
results <- cbind(results,str_split_fixed(results$V3, "[_-]", 9)) 

(это предполагает, что вы все в порядке с наличием оригинальных колонков еще на месте)

Смежные вопросы