在r中使用if .... else语句进行子集

时间:2018-03-22 15:52:41

标签: r subset

我正在尝试对数据框进行子集,以便在列名存在的情况下进行子集,但如果不存在则忽略。对于示例,我将使用mtcars数据集。我想要完成的是如果有一个专栏" vs"前三列和相对的子集这将是一个名为" vsdf"的日期帧。

df <- mtcars
if(colnames(df)=="vs") {
   vsdf <- df[,1,2,3,"vs"]
} else {
  NULL
}

非常感谢任何帮助或指导。

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

1)使用==

您想要检查“vs”是否是列名称的一部分,但由于您使用的是==,这意味着您正在检查列名称(所有存在的名称)是否正好“vs ”。只有当只有一列并且称为“vs”时才会出现这种情况。相反,您需要使用%in%,如

if("vs" %in% colnames(d)) 
 {...}

2)子字幕语法df[,1,2,3,"vs"]

对data.frame进行子集化通常遵循语法

df[i, j] 

其中i表示行,j表示列。由于您希望对列进行子集化,因此您将在j中执行此操作。你所做的是为[.data.frame提供的参数多于它所需的参数,因为你没有将这些值放入向量中。向量可以是数字/整数或字符向量,但两种形式都是混合的,就像你做的那样。相反,您可以像这样构建矢量:

df[, c(names(df)[1:3], "vs")]