【问题标题】:Subsetting with an if....else statement in r在 r 中使用 if....else 语句进行子集化
【发布时间】:2018-03-23 00:02:39
【问题描述】:

我正在尝试对数据框进行子集化,以便如果存在列名,我将子集化,但如果不存在,则忽略。例如,我将使用 mtcars 数据集。我想要完成的是,如果有一个列“vs”子集的前 3 列和 vs。这将是一个名为“vsdf”的日期框架。

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

任何帮助或指导将不胜感激。

【问题讨论】:

  • vsdf &lt;- if("vs" %in% names(df)) cbind(df[,1:3], df$vs) else NULL

标签: r subset


【解决方案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")]

【讨论】:

  • 感谢您的真知灼见,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 2016-10-13
  • 2020-09-06
  • 2016-11-13
  • 2018-06-29
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多