我的for循环在R中的语法正确吗?

问题描述 投票:0回答:3

我的数据如下(我称之为data1):

X_4_2_1_a  X_4_2_2_a
5          7
999        999
998        998
2          998
1          NA
NA         999

我想对数据应用以下功能:

na.zero <- function (x) {
  x[is.na(x)] <- 0
  return(x)
}

而且我想使用以下循环:

for (i in seq(1, 2, 1)) {
  data1$X_4_2_i_a <- na.zero(data1$X_4_2_i_a)
}

但是它不起作用。有人可以帮忙吗?

r for-loop
3个回答
1
投票

我假设您的计划是将功能应用于data.frame()的两列。现在,您没有指定要迭代的内容。

for (i in seq(1, 2, 1)) {
  data1[, i] <- na.zero(data1[, i])
}
# Your data.frame after running the loop
  X_4_2_1_a X_4_2_2_a
1         5         7
2       999       999
3       998       998
4         2       998
5         1         0
6         0       999

要遍历列,可以使用[。其中第一个值代表行,第二个值代表列。因此,[, i]的意思是:将您的函数应用于第一列,然后应用于第二列以及所有行。


此外,还值得一提的是,R提供了应用程序家族来解决此类问题。

为您的问题应用家庭解决方案将使代码效率更高:

apply(data1, 2, na.zero)
# Where 2 represent an iteration over columns
  X_4_2_1_a X_4_2_2_a
1         5         7
2       999       999
3       998       998
4         2       998
5         1         0
6         0       999

1
投票

我很欣赏这个问题,更多地是关于循环中函数的应用,但这是一个简单的矢量化Base R解决方案,可以实现相同的结果:

df <- replace(df, is.na(df), 0)

数据:

df <- structure(list(X_4_2_1_a = c(5, 999, 998, 2, 1, 0), X_4_2_2_a = c(7, 
999, 998, 998, 0, 999)), row.names = c(NA, -6L), class = "data.frame")

1
投票

问题出在您要访问的数据帧中的变量上,您试图访问的X_4_2_i_a并不是每次迭代都递增i,因为它是一个字符串;这不是迭代增加数据框中的标签的方法。

您可以考虑在每次迭代中使用paste创建一个变量,然后对其进行访问

paste(“ X_4_2_”,i,“ _a”,sep =“”)

na.zero <- function (x) {
  x[is.na(x)] <- 0
  return(x)
}

df = data.frame("X_4_2_1_a"=c(5,999,998,2,1,NA), "X_4_2_2_a"=c(5,999,998,NA,1,NA))

for (i in seq(1, 2, 1)) {
    nn = paste("X_4_2_", i, "_a", sep = "")
    df[nn] <- na.zero(df[nn])
}


print(df)

将产生:

  X_4_2_1_a X_4_2_2_a
1         5         5
2       999       999
3       998       998
4         2         0
5         1         1
6         0         0

没有循环的解决方案是:

df = sapply(df, na.zero)
print(df)

将产生相同的输出

© www.soinside.com 2019 - 2024. All rights reserved.