2015-04-11 2 views
1

Возможные дубликаты:How to sort a dataframe by column(s)?сортировки столбцов кадра данных

У меня есть кадр данных в различных порядках (в терминах столбцов).

 ID_REF  VALUE  ABS_CALL   DETECTION.P.VALUE 
1 10071_s_at 3473.60000  P/present  0.000219000 
2  1053_at 643.20000  P/present  0.000673000 
3  117_at 564.00000  M/Marginal  0.000322000 
4  1255_g_at 9.40000  A/absent  0.602006000 
5  1294_at 845.60000  P/present  0.000468000 
6  1320_at 94.30000  A/absent  0.204022000 

Теперь ниже порядок столбцов изменяется

VALUE  ID_REF  ABS_CALL   DETECTION P-VALUE 
1 3473.6 10071_s_at P/present   0.000219 
2 643.2 1053_at  P/present   0.000673 
3 564  117_at  M/marginal   0.000322 
4 9.4  1255_g_at A/absent   0.602006 
5 845.6 1294_at  P/present   0.000468 
6 94.3  1320_at  A/absent   0.204022 

Опять изменяется

DETECTION P-VALUE VALUE ID_REF  ABS_CALL 
1 0.000219    3473.6 10071_s_at P 
2 0.000673    643.2 1053_at  P 
3 0.000322    564  117_at  M 
4 0.602006    9.4  1255_g_at A 
5 0.000468    845.6 1294_at  P 
6 0.204022    94.3 1320_at  A 

Здесь у меня есть один и тот же кадр данных в различных порядках столбцов. Я не знаю, порядок кадра данных, поэтому я хочу, чтобы поместить данные в формате ниже:

 ID_REF  VALUE  ABS_CALL   DETECTION.P.VALUE 
1 10071_s_at 3473.60000  P/present  0.000219000 
2  1053_at 643.20000  P/present  0.000673000 
3  117_at 564.00000  M/Marginal  0.000322000 
4  1255_g_at 9.40000  A/absent  0.602006000 
5  1294_at 845.60000  P/present  0.000468000 
6  1320_at 94.30000  A/absent  0.204022000 

Здесь мне нужно, чтобы проверить, есть ли подстрока _at в любом столбце затем положить, что в первый столбец. Если какой-либо столбец имеет значения больше 1, тогда поместите этот столбец в качестве второго столбца кадра данных. Если какая-либо колонка имеет уровни P, A, M или present, absent, marginal, тогда положите это как третий столбец и, наконец, любой столбец со значениями меньше 1 будет последним. Кто-нибудь может сказать мне, как это сделать в R эффективно?

Примечание: Имена столбцов не являются постоянными, это может быть что угодно (разные имена).

ответ

2

Это не элегантный любыми средствами, но вы можете написать функцию, которая смотрит только в одной строке и поиск для каждого из критериев:

dat1 <- read.table(header = TRUE, check.names = FALSE, 
text="ID_REF  VALUE  ABS_CALL   DETECTION.P.VALUE 
1 10071_s_at 3473.60000  P/present  0.000219000 
2  1053_at 643.20000  P/present  0.000673000 
3  117_at 564.00000  M/Marginal  0.000322000 
4  1255_g_at 9.40000  A/absent  0.602006000 
5  1294_at 845.60000  P/present  0.000468000 
6  1320_at 94.30000  A/absent  0.204022000") 

dat2 <- read.table(header = TRUE, check.names = FALSE, 
text="VALUE  ID_REF  ABS_CALL   'DETECTION P-VALUE' 
1 3473.6 10071_s_at P/present   0.000219 
2 643.2 1053_at  P/present   0.000673 
3 564  117_at  M/marginal   0.000322 
4 9.4  1255_g_at A/absent   0.602006 
5 845.6 1294_at  P/present   0.000468 
6 94.3  1320_at  A/absent   0.204022") 

dat3 <- read.table(header = TRUE, check.names = FALSE, 
text=" 'DETECTION P-VALUE' VALUE ID_REF  ABS_CALL 
1 0.000219    3473.6 10071_s_at P 
2 0.000673    643.2 1053_at  P 
3 0.000322    564  117_at  M 
4 0.602006    9.4  1255_g_at A 
5 0.000468    845.6 1294_at  P 
6 0.204022    94.3 1320_at  A") 


f <- function(data) { 
    d1 <- data[1, , drop = FALSE] 
    ## from row 1, separate out numerics, p-value is < 1 
    ## and the other we assume is value 
    nums <- d1[, nn <- sapply(d1, is.numeric)] 
    p <- names(nums[, nums < 1, drop = FALSE]) 
    val <- setdiff(names(nums), p) 

    ## take all the other columns, find `_at$` as id 
    ## and assume the other column is `abs_call` 
    ch <- d1[, !nn, drop = FALSE] 
    id <- names(ch[, grepl('_at$', as.character(unlist(ch))), drop = FALSE]) 
    abs <- setdiff(names(ch), id) 

    ## order by the name found 
    data[, c(id, val, abs, p)] 
} 

lapply(list(dat1, dat2, dat2), f) 

# [[1]] 
#  ID_REF VALUE ABS_CALL DETECTION.P.VALUE 
# 1 10071_s_at 3473.6 P/present   0.000219 
# 2 1053_at 643.2 P/present   0.000673 
# 3  117_at 564.0 M/Marginal   0.000322 
# 4 1255_g_at 9.4 A/absent   0.602006 
# 5 1294_at 845.6 P/present   0.000468 
# 6 1320_at 94.3 A/absent   0.204022 
# 
# [[2]] 
#  ID_REF VALUE ABS_CALL DETECTION P-VALUE 
# 1 10071_s_at 3473.6 P/present   0.000219 
# 2 1053_at 643.2 P/present   0.000673 
# 3  117_at 564.0 M/marginal   0.000322 
# 4 1255_g_at 9.4 A/absent   0.602006 
# 5 1294_at 845.6 P/present   0.000468 
# 6 1320_at 94.3 A/absent   0.204022 
# 
# [[3]] 
#  ID_REF VALUE ABS_CALL DETECTION P-VALUE 
# 1 10071_s_at 3473.6 P/present   0.000219 
# 2 1053_at 643.2 P/present   0.000673 
# 3  117_at 564.0 M/marginal   0.000322 
# 4 1255_g_at 9.4 A/absent   0.602006 
# 5 1294_at 845.6 P/present   0.000468 
# 6 1320_at 94.3 A/absent   0.204022 
+0

Спасибо и очень много. :) –

+0

Если мне нужно найти все строки, потому что я не знаю, как поступают данные, если какая-либо запись отсутствует для любого столбца. Затем его нужно искать в другой строке, а также –

+0

вы можете использовать 'na.omit (data) [1,]' вместо просто 'data [1,]'. na.omit будет отфильтровывать любую строку с любыми значениями NA, поэтому, если есть хотя бы одна строка со всеми значениями, это должно работать – rawr

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