r - 我想用 for 循环或函数来表达这段代码

标签 r

我有一个大数据框。

如您所见,模式存在于以下代码中:

data_1<-data_1
data_2<-data_2 %>% filter(rowSums(data_2[,1:1])==0)
data_3<-data_3 %>% filter(rowSums(data_3[,1:2])==0)
data_4<-data_4 %>% filter(rowSums(data_4[,1:3])==0)
data_5<-data_5 %>% filter(rowSums(data_5[,1:4])==0)
data_6<-data_6 %>% filter(rowSums(data_6[,1:5])==0)
data_7<-data_7 %>% filter(rowSums(data_7[,1:6])==0)
data_8<-data_8 %>% filter(rowSums(data_8[,1:7])==0)
data_9<-data_9 %>% filter(rowSums(data_9[,1:8])==0)
data_10<-data_10 %>% filter(rowSums(data_10[,1:9])==0)
data_11<-data_11 %>% filter(rowSums(data_11[,1:10])==0)
data_12<-data_12 %>% filter(rowSums(data_12[,1:11])==0)
data_13<-data_13 %>% filter(rowSums(data_13[,1:12])==0)
data_14<-data_14 %>% filter(rowSums(data_14[,1:13])==0)
data_15<-data_15 %>% filter(rowSums(data_15[,1:14])==0)
data_16<-data_16 %>% filter(rowSums(data_16[,1:15])==0)
data_17<-data_17 %>% filter(rowSums(data_17[,1:16])==0)
data_18<-data_18 %>% filter(rowSums(data_18[,1:17])==0)
data_19<-data_19 %>% filter(rowSums(data_19[,1:18])==0)
data_20<-data_20 %>% filter(rowSums(data_20[,1:19])==0)
data_21<-data_21 %>% filter(rowSums(data_21[,1:20])==0)

我试过这样循环

for(i in 1:21){
  data_i <- data_i %>% filter(rowSums(data_i[,1:i-1])==0)

但是,data_i 与我的意图相去甚远。

我该如何解决这个问题?

最佳答案

1) for 我们使用最后注释中的测试数据是基于R自带的内置anscombe数据框。最好把相关的数据框放在一个列表中,这样我们首先创建这样一个列表 L 然后迭代它产生一个新列表 L2 这样我们就不会覆盖原始列表。保持输入和输出分开可以更容易调试。

我们可以交替地把 seq_along(L)[-1] 写成 seq(2, length(L)) 也可以交替地写 seq_len(i -1) 作为 seq(1, i-1)。请注意,如果 DF 是数据框,则 DF[, 1] 是作为列向量 的第一列,但 DF[, 1, drop = FALSE] 是一列数据框

没有使用包。

L <- mget(ls(pattern = "^data_\\d+$"))
L2 <- L
for(i in seq_along(L)[-1]) {
  Li <- L[[i]]
  Sum <- rowSums(Li[, seq_len(i-1), drop = FALSE])
  L2[[i]] <- Li[Sum == 0, ]
} 

2) lapply 或者我们可以使用 lapply:

L <- mget(ls(pattern = "^data_\\d+$"))
L2 <- L
L2[-1] <- lapply(seq_along(L)[-1], function(i) {
  Li <- L[[i]]
  Sum <- rowSums(Li[, seq_len(i-1), drop = FALSE])
  Li[Sum == 0, ]
})

3) map 或使用 map

L3 <- L
f3 <- function(d, i) {
  Sum <- rowSums(d[, seq_len(i-1), drop = FALSE])
  d[Sum == 0, ]
}
L3[-1] <- Map(f3, L[-1], seq_along(L)[-1])

或者像这样的第一个元素的特殊情况。请注意,它会将组件名称从函数后的第一个参数传递给 Map,因此定义 f4 以使该参数为 L 很重要。

f4 <- function(d, i) {
  if (i == 1) d 
  else {
    Sum <- rowSums(d[, seq_len(i-1), drop = FALSE])
    d[Sum == 0, ]
  }
}
L4 <- Map(f4, L, seq_along(L))

注意事项

# create test data
data_1 <- anscombe
data_1[1, 1] <- 0
data_2 <- 10 * anscombe
data_2[2, 1:2] <- 0
data_3 <- 100 * anscombe
data_3[3, 1:3] <- 0

关于r - 我想用 for 循环或函数来表达这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71222380/

相关文章:

r - 将每列中的字符串拆分为几列

R:基于字符串访问对象字段

揭示 igraph 中的交互集群

r - 在R中,根据行之间的差异计算新列

r - 交叉验证 CART 模型

r - 在ggplot中自定义geom_point参数

r - 子集数据框,其中日期在 R 中日期向量的 x 天内

r - 查找数据为大写的范围的开始和结束

java - RWeka 在 OSX 10.10.5 下抛出 java.lang.UnsupportedClassVersionError

rCharts nvd3 库强制刻度