2015-03-18 2 views
1

У меня есть список фреймов данных:Решение на основе заголовков кадра данных

df 
[[1]] 
    ID SignalIntensity  SNR 
1 109  6.182309 0.8453577 
2 110  10.172777 4.3837078 
3 111  7.292275 1.0725751 
4 112  8.898467 2.3192185 
5 113  9.591034 3.7133402 
7 116  7.789323 1.3636656 
8 117  7.194835 1.1349738 
9 118  6.572773 0.9041846 
11 120  9.371126 2.9968457 
12 121  6.154944 0.7777584 

[[2]] 
    ID SignalIntensity  SNR 
1 118  6.572773 0.9041846 
2 119  5.377519 0.7098581 
3 120  9.371126 2.9968457 
4 121  6.154944 0.7777584 
5 123  5.797446 0.7235425 
6 124  5.573614 0.7019574 
7 125  7.014537 0.3433343 
8 126  6.089159 0.7971650 
9 127  6.314820 0.7845944 
10 131  5.342544 1.2300000 

Он имеет заголовки, как IDSignalIntensity и SNR. Я проверяю заголовки по именам (df [[1]]). Теперь после проверки заголовков я должен принять решение, такие как, если заголовки df[[1]] являются ID, SingnalIntensity и SNR затем сделать что-то вроде

If(names(df[[1]]=="ID")) 
    { 
    print("This is data from Illumina platform") 

    my code.......... 
    } 
    else if{my code...........} 

Вот как вы знаете, он имеет три заголовки.

Я знаю, что мой способ сделать это не так, как показано ниже след

if(names(df[[1]]=="ID, SignalIntensity, SNR")), это дает мне
Error in if (names(df[[1]] == "ID, SignalIntensity, SNR")) { : argument is of length zero что вполне очевидно.

Как установить if{} так, чтобы он соответствовал всем трем заголовкам или (заголовок нашего выбора либо 1 r 2 r 3), и перейдите к другому коду, если true, иначе сделайте что-нибудь еще. Благодаря

+0

Что-то вроде: 'если (длина (пересечение (имена (df [[1]], c («ID», «SignalIntensity», «SNR») == 3) {my code} ' – zx8754

+0

@ zx8754 это' if (length (intersect (names (DF [[1]], с ("ID",» SignalIntensity "," SNR ") == 3) {my code}' или if (length (intersect (имена (df [[1]], c («ID», «SignalIntensity», «SNR») == 3)))) {мой код} –

+0

@ zx8754, Aaghaz, пожалуйста, сообщите об этом в ответ – smci

ответ

1

Расширение на мои комментарии, попробуйте следующее:

#dummy data 
df <- 
    list(
    data.frame(ID=1:5, 
       SignalIntensity=runif(5), 
       SNR=runif(5)), 
    data.frame(ID=1:3, 
       x=runif(3)), 
    data.frame(ID=1:5, 
       SignalIntensity=runif(5), 
       SNR=runif(5))) 

#check 1st data frame 
if(length(intersect(names(df[[1]]),c("ID","SignalIntensity","SNR")))==3){ 
    print("Illumina platform")} else { 
    print("Non Illumina platform")} 
# [1] "Illumina platform" 

#check all dataframes 
lapply(df,function(i) 
    if(length(intersect(names(i),c("ID","SignalIntensity","SNR")))==3){ 
    "Illumina platform"} else { 
     "Non Illumina platform"}) 
# [[1]] 
# [1] "Illumina platform" 
# 
# [[2]] 
# [1] "Non Illumina platform" 
# 
# [[3]] 
# [1] "Illumina platform" 
1

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

headers <- c("ID", "SNR") # can add more header names here 
hasHeader <- is.element(headers, names(df[[1]])) # c(T, T) 
sumHeader <- sum(hasHeader, na.rm=T)    # 2 
result <- ifelse(sumHeader==length(sumHeader), T, F) 

# result is T if "ID" and "SNR" are names of df[[1]] 
+0

Спасибо за ваши комментарии: Ошибка в if (names (df [[1]] == "ID")) {: аргумент имеет нулевую длину –

+0

Похоже, что ваши 'names (df [[1]]) пустые. Можете ли вы проверить, так ли это? –

+1

Его не пусто. Ваш код должен работать. Я думаю, что у меня что-то отсутствует, так как мой код очень большой. Огромное спасибо. –

1

Если вы хотите продолжить код непосредственно:

wanted_colnames = c("ID","SignalIntensity","SNR") 

lapply(df, function(u){ 
    if(any(wanted_colnames %in% names(u))) 
    { 
     # do something 
    } else { 
     # do something 
    } 
}) 
+0

Спасибо за ваши комментарии. На самом деле я не хочу отфильтровывать что-либо. Я просто хочу принять решение на основе моих заголовков фреймов. –

+0

Ответ отредактирован! –