【问题标题】:the use of minus sign inside square brackets在方括号内使用减号
【发布时间】:2017-07-10 17:13:28
【问题描述】:

下面是 Datacamp 的一个练习。

使用 cbind() 调用包含所有三个工作表。确保urban_sheet2 和urban_sheet3 的第一列被删除,这样您就没有重复的列。将结果存储在城市中。

代码:

# Add code to import data from all three sheets in urbanpop.xls
path <- "urbanpop.xls"
urban_sheet1 <- read.xls(path, sheet = 1, stringsAsFactors = FALSE)
urban_sheet2 <- read.xls(path, sheet = 2, stringsAsFactors = FALSE)
urban_sheet3 <- read.xls(path, sheet = 3, stringsAsFactors = FALSE)

# Extend the cbind() call to include urban_sheet3: urban
urban <- cbind(urban_sheet1, urban_sheet2[-1],urban_sheet3[-1])

# Remove all rows with NAs from urban: urban_clean
urban_clean<-na.omit(urban)

我的问题是为什么要使用[-1] 删除cbind 中的第一列。是cbind()里面的方括号的特殊用法吗?这是否意味着如果我想删除前两列代码应该是urban_sheet2[-2]?我只知道方括号用于选择某些列或行。这让我很困惑。

【问题讨论】:

标签: r dataframe square-bracket


【解决方案1】:

这并非特定于 cbind()。您可以在方括号内使用- 来删除您想要的任何特定行或列。如果您的数据框是 dfdf[,-1] 将删除其第一列。 df[,-2] 将删除其第二个(也是唯一的第二个)列。 df[,-c(1,2)] 将删除其第一列和第二列。同样,df[-1,] 将删除其第一行,等等。

这不能用列名来完成,例如,df[,-"var1"] 将不起作用。要使用列名,您可以使用which(),如df[,-which(names(df) %in% "var1")],但简单的df[,!names(df) %in% "var1")] 更容易并产生相同的结果。你也可以使用subset()subset(df, select = -c(var1, var2));这将删除名为“var1”和“var2”的列。

注意删除行和列只影响调用的输出,不会影响原对象,除非输出分配给原对象。

【讨论】:

  • 谢谢,现在这很有意义。但是为什么没有逗号的代码 'urban_sheet2[-1]' 在 Datacamp 中有效?是错误还是 [, -1] 等于 [-1]?
  • 如果有数据框,可以省略逗号来引用逗号。我更喜欢始终包含它,以便清楚地看到您引用的是数据框或矩阵的列,而不是向量中的项目。省略逗号只是一种捷径,在我看来,它只会让事情变得更加混乱。
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多