如何在R中使用for循环处理数据帧?

时间:2020-01-18 03:41:16

标签: r dataframe

### Part1 --------------------------------------------------------------
data5 <- data.frame(late_AMD_1st=c(1, NA, 3, 4), RVO_1st=c(5, 6, NA, 8))
# late_AMD_1st RVO_1st
# 1            1       5
# 2           NA       6
# 3            3      NA
# 4            4       8
data5 <- subset(data5, !(is.na(data5$late_AMD_1st)))
data5 <- subset(data5, !(is.na(data5$RVO_1st)))
# data5
# late_AMD_1st RVO_1st
# 1            1       5
# 4            4       8
### Part2 --------------------------------------------------------------

data5 <- data.frame(late_AMD_1st=c(1, NA, 3, 4), RVO_1st=c(5, 6, NA, 8))
col_name <- c("late_AMD_1st", "RVO_1st")
for (i in col_name){
  data5 <- subset(data5, !(is.na(data5$i)))
}
# data5
# [1] late_AMD_1st RVO_1st     
# <0 行> (または長さ 0 の row.names) 

我想做与Part2中的Part1相同的事情。但是我以某种方式在Part2中获得了不同的data.frame。我在使用for循环时错了吗?

2 个答案:

答案 0 :(得分:1)

如果您真的想使用循环

data5 <- data.frame(late_AMD_1st=c(1, NA, 3, 4), RVO_1st=c(5, 6, NA, 8))
col_name <- c("late_AMD_1st", "RVO_1st")
for (i in col_name){
  data5 <- subset(data5, !(is.na(data5[, i])))
}

data5
#late_AMD_1st RVO_1st
#1            1       5
#4            4       8

在这里,data5[, i]i的{​​{1}}中的列名。


如果您的目标是删除带有data5 all 行,则可以轻松地无循环执行此操作。

NA

答案 1 :(得分:0)

除了@Suren的方法na.omit(data5)之外,您还可以使用以下代码,该代码适用于具有更多列的数据帧

res <- subset(data5,complete.cases(data5))

res <- subset(data5,Reduce(`&`,data.frame(!is.na(data5))))

这样

> res
  late_AMD_1st RVO_1st
1            1       5
4            4       8