【问题标题】:Decision based on the headers of a data frame基于数据帧头的决策
【发布时间】:2015-03-18 11:33:54
【问题描述】:

我有一个数据框列表:

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

它的标题为 ID SignalIntensitySNR。我按名称检查标题(df [[1]])。现在检查标题后,我需要做出决定,例如 df[[1]] 的标题是否为 IDSingnalIntensitySNR 然后执行类似的操作

    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,则转到其他代码,否则执行其他操作。谢谢

【问题讨论】:

  • 类似:if(length(intersect(names(df[[1]],c("ID","SignalIntensity","SNR")==3){ my code}
  • @zx8754 是 if(length(intersect(names(df[[1]],c("ID","SignalIntensity","SNR")==3){ my code} 还是 if(length(intersect(names(df[[1]],c("ID","SignalIntensity","SNR")==3)) )){ 我的代码}
  • @zx8754,Aaghaz 请将其发布为答案
  • @zx8754 as.vector(y) 中的错误:缺少参数“y”,没有默认值

标签: r dataframe conditional-statements columnname


【解决方案1】:

扩展我的 cmets,试试这个:

#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"

【讨论】:

    【解决方案2】:

    试试这个代码:

    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]]
    

    【讨论】:

    • 感谢您的 cmets:if (names(df[[1]] == "ID")) { : 参数长度为零时出错
    • 您的names(df[[1]]) 似乎是空的。你能检查一下是不是这样吗?
    • 它不是空的。您的代码应该可以工作。我想我在这里遗漏了一些东西,因为我的代码非常大。非常感谢。
    【解决方案3】:

    如果你想直接继续代码:

    wanted_colnames = c("ID","SignalIntensity","SNR")
    
    lapply(df, function(u){
        if(any(wanted_colnames %in% names(u)))
        {
            # do something
        } else {
            # do something
        }
    }) 
    

    【讨论】:

    • 感谢您的 cmets。其实我不想过滤掉任何东西。我只是想根据我的数据帧头做出决定。
    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多