我的数据如下(我称之为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)
}
但是它不起作用。有人可以帮忙吗?
我假设您的计划是将功能应用于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
我很欣赏这个问题,更多地是关于循环中函数的应用,但这是一个简单的矢量化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")
问题出在您要访问的数据帧中的变量上,您试图访问的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)
将产生相同的输出