R:更改循环内的对象

时间:2018-05-25 09:56:33

标签: r loops for-loop apply lapply

a <- data.frame(x = c(1, 2))
b <- data.frame(x = c(3, 4))

for (df in list(a, b)) {
  print(df)
  df$y <- c(5, 6)
}

每个数据框都会正确打印出来,但添加其他列失败 广泛的网络搜索建议像

lapply(list(a, b), function(df){
  df$y <- c(5, 6)
})

但这对我没有帮助。

我也非常感兴趣的是,为什么for循环中的print语句有效,但y列的添加失败。

这对我来说很令人惊讶。

2 个答案:

答案 0 :(得分:1)

您必须使用该附加列返回df。 尝试:

lapply(list(a, b), function(df){
  df$y <- c(5, 6); return(df)
})

输出结果为:

[[1]]
  x y
1 1 5
2 2 6

[[2]]
  x y
1 3 5
2 4 6

正如@ dash2假设您可能希望将更改后的df分配给list dfa <- data.frame(x = c(1, 2)) b <- data.frame(x = c(3, 4)) l <- list(a, b) l <- lapply(l, function(df){ df$y <- c(5, 6); return(df) }) 。所以完整的代码看起来像:

def foldByTitle(listInput: List[String]): List[Item] =
  listInput.map(Item.parseItem).foldLeft(List.empty[Item])(sumByTitle)

val sumByTitle: (List[Item], Item) => List[Item] = (acc, curr) =>
  acc.find(_.name == curr.name).fold(curr :: acc) { i =>
    acc.filterNot(_.name == curr.name) :+ i.copy(num1 = i.num1 + curr.num1, num2 = i.num2 + curr.num2)
  }

case class Item(name: String, category: String, num1: Int, num2: Int)
object Item {
  def parseItem(serializedItem: String): Item = {
    val itemTokens = serializedItem.split(",").map(_.trim)
    Item(itemTokens.head, itemTokens(1), itemTokens(2).toInt, itemTokens(3).toInt)
  }
}

答案 1 :(得分:0)

> a <- data.frame(x = c(1, 2))
> b <- data.frame(x = c(3, 4))
> l <- list(a = a, b = b)
> list2env(lapply(l, function(x) {x$y <- c(5, 6);x}), envir = .GlobalEnv)
<environment: R_GlobalEnv>
> a
  x y
1 1 5
2 2 6
> b
  x y
1 3 5
2 4 6