2013-04-19 2 views
1

Я пробовал несколько способов сделать это, но безуспешно. В основном у меня есть огромный фреймворк с шестью столбцами и +8000 строк. Первый столбец имеет двухбуквенную надпись (например, AA, затем AB и т. Д.). Второй столбец имеет некоторое числовое значение, которое является общим для четырех столбцов (например, от 0 до 180 для AA, от 0 до 170 для AB и т. Д.). Остальные столбцы - это значения.разделение столбца и создание новых столбцов в r

Это выдержка из моего DataFrame:

structure(list(X2code = c("AA", "AA", "AA", "AA", "AA", "AA", 
"AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", 
"AA", "AA", "AA", "AA", "AA", "AA", "AB", "AB", "AB", "AB", "AB", 
"AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", 
"AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", 
"AB", "AB", "AB", "AB", "AB", "AB", "AC", "AC", "AC", "AC", "AC", 
"AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC" 
), DOY = c(294L, 295L, 296L, 297L, 298L, 299L, 300L, 301L, 302L, 
303L, 304L, 305L, 306L, 307L, 308L, 309L, 310L, 311L, 312L, 313L, 
314L, 315L, 316L, 294L, 295L, 296L, 297L, 298L, 299L, 300L, 301L, 
302L, 303L, 304L, 305L, 306L, 307L, 308L, 309L, 310L, 311L, 312L, 
313L, 314L, 315L, 316L, 317L, 318L, 319L, 320L, 321L, 322L, 323L, 
324L, 325L, 326L, 168L, 169L, 170L, 171L, 172L, 173L, 174L, 175L, 
176L, 177L, 178L, 179L, 180L, 181L, 182L, 183L), WDrain = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 
0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 
0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 
0.13, 0.13, 0.13, 0.13, 244.1, 244.1, 244.1, 244.1, 244.1, 244.1, 
244.1, 244.1, 244.1, 244.1, 244.1, 244.1, 244.1, 244.1, 244.1, 
244.1), CumET = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.34, 4.75, 5.33, 
6.67, 7.41, 7.84, 8.78, 9.59, 10.47, 10.57, 11.17, 11.91, 12.07, 
12.48, 12.63, 12.88, 13.8, 14.56, 15.11, 15.43, 15.86, 16.66, 
17.27, 17.54, 18.21, 18.64, 18.75, 19.11, 19.2, 19.85, 20.48, 
21.02, 21.32, 222, 226, 233, 241, 250, 258, 265, 269, 271, 276, 
279, 281, 281, 283, 285, 288), SoilAvW = c(NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 246.51, 245.1, 249.52, 248.68, 248.04, 247.44, 246.5, 
245.69, 244.81, 244.71, 244.11, 243.37, 243.3, 242.88, 242.83, 
242.58, 241.66, 241, 243.65, 243.5, 243.36, 242.65, 249.03, 250.74, 
253.05, 266.21, 270.28, 279.71, 287.9, 288.84, 288.69, 288.25, 
295.13, 330.2, 326, 319.5, 311.2, 302.8, 294.4, 287.7, 287.2, 
285, 280.4, 278.6, 276, 282.3, 286.5, 284.1, 281.5), Runoff = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L), Transp = c(NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0.01, 0.01, 
0.01, 0.01, 0.02, 0.02, 0.02, 0.02, 0.03, 0.03, 0.03, 0.03, 0.04, 
0.04, 0.04, 0.04, 0.04, 0.05, 0.05, 105.7, 109.1, 114.5, 121.5, 
128.9, 136.2, 141.9, 145.4, 147.1, 150.7, 152.9, 154.8, 155, 
155.8, 157.9, 159.9)), .Names = c("X2code", "DOY", "WDrain", 
"CumET", "SoilAvW", "Runoff", "Transp"), class = "data.frame", row.names = c(NA, 
-72L)) 

То, что я хотел бы сделать, это создать 4 новые кадры данных, где в каждом dataframe я хочу, чтобы разбить длинную колонну таким образом, что AA, AB , и т. д. будут новые столбцы. Кроме того, рядом со значениями я хочу, чтобы значения столбца 2 соответствовали каждому 2-коду. Например, AA будет иметь столбец 0-to-180, тогда значения AB будут иметь значение столбца от 0 до 170, а затем его значения. Кроме того, поверх столбца я хотел бы поместить 2-буквенный код для обоих столбцов. Вот пример кадра данных, который я хотел бы иметь (например, это значение value1).

AA AA AB AB AC AC 

0 2 0 0.5 0 50 
1 2.4 1 1.6 1 0.6 
2 5 2 4.6 .. .. 
3 6.7 3 2 .. .. 
.. .. .. ..  
.. .. 170 70  
180 10   

А внизу часть моего кода:

setwd("C:\\.....") 

    my.data <- read.table("my.data.txt", header=T, na.strings = c("na" , "n/a" , "NA" , "") , stringsAsFactors = F) 

    for(id in my.data$2.code) 
    { 

# here I take the columns 2 to 3 in the data, the first col is the ID that is used             # to let R understand that for each ID needs to do a certain operation 

     data.code <- my.data[my.data$2.code == id, 2:3] 

    # And now my is my problems... I tried with DOBY, and other operations but I could not do what I want!! 
     write.table(....., "trials.txt", quote=F, col.names=FALSE, row.names= F) 


      } 
+1

Пожалуйста, прочтите [это] (http://stackoverflow.com/a/5963610/1412059), а затем предоставить данные. – Roland

+0

спасибо за отзыв. Я не сделал этого. Я подмножу свои фактические данные, и я использовал функцию dput(). Я помещаю этот пример в мой отредактированный вопрос. Еще раз спасибо, и, пожалуйста, дайте мне знать, если это все еще не хорошо! Мне нужно улучшить свое общее понимание того, как это работает. – david

+1

Я все еще не вижу ваши данные образца. Вы также можете выполнить 'dput (df [1:20,])' и просто показать 20 строк ваших данных образца. –

ответ

2

Я рекомендую оставить data.frame, как это, так как он является наиболее разумным форматом для дальнейшей обработки в R. Однако, здесь некоторые возможности, которые точно не достигают желаемого результата (не так легко), но могут по-прежнему быть полезными.

library(reshape2) 
WDrain.wide <- dcast(DF,DOY~X2code,value.var='WDrain') 

library(plyr) 
WDrain.strange <- dlply(DF,.(X2code),function(x) x[,2:3]) 

Или как это было предложено @ SimonO101:

split(DF[,-1],DF[,1]) 
+0

ОК, я пробовал эти решения, и они отлично работают. Всем спасибо! Но теперь у меня есть проблема сближения вещей. Я подумал о чем-то, но мне не хватает технических навыков для их реализации в R. В принципе, я мог бы игнорировать столбец DOY и использовать один и тот же для всех переменных. Конечно, каждый «2-кодовый» имеет разную длину.Однако, если я создаю матрицу с NA, которые имеют длину более длинной переменной, а после разделения я заполняю матрицу? – david

+0

Я начал писать код, но я нахожу проблемы в заполнении матрицы. Я проверил в других блогах, как это сделать, но я не получаю много удовлетворительных ответов. Матрица может быть моим выходным DF, который я описал выше, разница в том, что у меня есть только один col для DOY (так как все они начинаются с формы 0, но длина отличается). В любом случае, это моя идея: 'mat.data <- matrix (data = NA, nrow = 308, ncol = 27) mysplit <-split (my.data [, 2], my.data [, 1 ]) for (i in 1: length (my.data $ 2.code)) # Надеюсь, это правильно ... { mysplit [[i]] # Как правильно заполнить матрицу? } ' – david

+0

Кроме того, если вы хотите указать каждому столбцу имя 2.code (например, первый col AA, второй AB и т. Д., Это легко, не так ли? Я буду использовать« paste »() " Еще раз заблаговременно! – david

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