如何防止强制列入R

时间:2018-05-22 15:01:46

标签: r

我正在尝试从矩阵中的两列中删除所有NA值,并确保两列都没有另一列不具有的值。 代码:

data <- dget(file)

dependent <- data[,"chroma"]
independent <- data[,"mass..Pantheria."]

names(independent) <- names(dependent) <- rownames(data)

for (name in rownames(data)) {

    if(is.na(dependent[name])) {
      independent$name <- NULL
      dependent$name <- NULL
  }

    if(is.na(independent[name])) {
      independent$name <- NULL
      dependent$name <- NULL
  }
}
print(dput(independent))
print(dput(dependent))

我是R的新手,我正试图用for循环执行此任务。但是,当我通过分配NULL删除部分时,我收到以下警告:

1: In independent$Aeretes_melanopterus <- NULL : Coercing LHS to a list
2: In dependent$name <- NULL : Coercing LHS to a list

不会删除任何元素,independentdependent会保留所有原始行。

文件(输入):

structure(list(chroma = c(7.443501276, 10.96156313, 13.2987235, 
17.58110922, 13.4991105), mass..Pantheria. = c(NA, 126.57, NA, 
160.42, 250.57)), .Names = c("chroma", "mass..Pantheria."), class = "data.frame", row.names = c("Aeretes_melanopterus", 
"Ammospermophilus_harrisii", "Ammospermophilus_insularis", "Ammospermophilus_nelsoni", 
"Atlantoxerus_getulus"))
                              chroma mass..Pantheria.
Aeretes_melanopterus        7.443501               NA
Ammospermophilus_harrisii  10.961563           126.57
Ammospermophilus_insularis 13.298723               NA
Ammospermophilus_nelsoni   17.581109           160.42
Atlantoxerus_getulus       13.499111           250.57

期望的输出:

structure(list(chroma = c(10.96156313, 17.58110922, 13.4991105
), mass..Pantheria. = c(126.57, 160.42, 250.57)), .Names = c("chroma", 
"mass..Pantheria."), class = "data.frame", row.names = c("Ammospermophilus_harrisii", 
"Ammospermophilus_nelsoni", "Atlantoxerus_getulus"))
                            chroma mass..Pantheria.
Ammospermophilus_harrisii 10.96156           126.57
Ammospermophilus_nelsoni  17.58111           160.42
Atlantoxerus_getulus      13.49911           250.57
structure(c(126.57, 160.42, 250.57), .Names = c("Ammospermophilus_harrisii", 
"Ammospermophilus_nelsoni", "Atlantoxerus_getulus"))
Ammospermophilus_harrisii  Ammospermophilus_nelsoni      Atlantoxerus_getulus 
                   126.57                    160.42                    250.57 
structure(c(10.96156313, 17.58110922, 13.4991105), .Names = c("Ammospermophilus_harrisii", 
"Ammospermophilus_nelsoni", "Atlantoxerus_getulus"))
Ammospermophilus_harrisii  Ammospermophilus_nelsoni      Atlantoxerus_getulus 
                 10.96156                  17.58111                  13.49911 

1 个答案:

答案 0 :(得分:2)

您希望忽略chromamass..PantheriaNA的数据中的行。这是一个快速的方法:

data = data[!is.na(data$chroma) & !is.na(data$mass..Pantheria.), ]

我不确定你为什么单独打破independentdependent,但过滤掉错误的观察结果后是一个很好的时机。< / p>

由于这些是您的唯一两列,这相当于省略数据框中具有任何NA值的行,因此您可以使用这样的快捷方式:

data = na.omit(data)

如果你想保持一个原始的&#34;复制原始数据,只需更改结果的名称:

data_no_na = na.omit(data)
# or
data = data[!is.na(data$chroma) & !is.na(data$mass..Pantheria.), ]

关于代码的错误,$用于从数据框中提取列,但您尝试将其用于命名向量(因为您&#39;已经提取了列),这是行不通的。即便如此,$仅适用于文字字符串,您无法将其与变量一起使用。对于数据框,您需要使用括号来提取存储在变量中的列。例如,内置mtcars数据有一个名为"mpg"的列:

# these work:
mtcars$mpg
mtcars[, "mpg"]

my_col = "mpg"
mtcars[, my_col]
mtcars$my_col ## does not work, need to use brackets!

您永远不能在数据框中使用$行名,只能使用列名。