我正在尝试对数据框进行子集,以便在列名存在的情况下进行子集,但如果不存在则忽略。对于示例,我将使用mtcars数据集。我想要完成的是如果有一个专栏" vs"前三列和相对的子集这将是一个名为" vsdf"的日期帧。
df <- mtcars
if(colnames(df)=="vs") {
vsdf <- df[,1,2,3,"vs"]
} else {
NULL
}
非常感谢任何帮助或指导。
答案 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")]