用lapply更改列表列表

时间:2017-02-27 16:09:55

标签: r list lapply

我有完全相同结构的列表列表,我想更改第二层中每个列表的一个元素。换句话说,我有一个对象x,y和amp; ž。该列表在另一个列表中重复多次。我需要在每个列表中更改x。做这个的最好方式是什么?

我目前的方法是创建一个小函数来执行我想要的更改,然后重新创建列表。但是有些东西让我觉得有更简单的方法可以做到这一点?

下面的代码显示了我的方法,这对我的玩具示例很好 - 但是真实的上下文对象更复杂,所以我真的不想多次重新创建它,因为我只改变了一个值。我可以这样做,只是感觉很复杂。

l = list(x = 1:3, y = "a", z = 9)
test = list(l, l, l)

standardize = function(obj){
  obj$x = obj$x / max(obj$x)
  list(obj$x, obj$y, obj$z)
}

lapply(test, function(e) standardize(e))

3 个答案:

答案 0 :(得分:3)

只需返回修改后的-------------------------------------------------------------------------------- You may only use the Microsoft .NET Core Debugger (clrdbg) with Visual Studio Code, Visual Studio or Visual Studio for Mac software to help you develop and test your applications. -------------------------------------------------------------------------------- The specified framework 'Microsoft.NETCore.App', version '1.0.1' was not found. - Check application dependencies and target a framework version installed at: C:\Program Files\dotnet\shared\Microsoft.NETCore.App - The following versions are installed: 1.1.0 - Alternatively, install the framework version '1.0.1'. The program 'c:\Projects\App1\bin\Debug\netcoreapp1.0\App1.dll' has exited with code -2147450749 (0x80008083). ,而不是重新创建列表。

{
"version": "1.1.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"testRunner": "xunit",
"dependencies": {
"xunit": "2.2.0-beta2-build3300",
"dotnet-test-xunit": "2.2.0-preview2-build1029"
},
 "frameworks": {
 "netcoreapp1.1": {
  "dependencies": {
    "Microsoft.NETCore.App": {
      //"type": "platform", //remove this line if trying to build a native app via runtime section
      "version": "1.1.0"
    }

  },
  "imports": "dnxcore50"
  }
},
"runtimes": { //this section allows you to specify runtime for native build output, note these will not generate unless type:"platform" is commented out in dependancies
    "win10-x64": {},
    "osx.10.11-x64": {}
  }
}

奖励:现在保留了obj元素的名称。

答案 1 :(得分:2)

使用purrr:

library(purrr)

test2 <- test %>% map(map_at, 'x', ~.x / max(.x))

test2 <- test %>% map(update_list, x = ~x / max(x))

无论哪种方式,你得到

str(test2)
## List of 3
##  $ :List of 3
##   ..$ x: num [1:3] 0.333 0.667 1
##   ..$ y: chr "a"
##   ..$ z: num 9
##  $ :List of 3
##   ..$ x: num [1:3] 0.333 0.667 1
##   ..$ y: chr "a"
##   ..$ z: num 9
##  $ :List of 3
##   ..$ x: num [1:3] 0.333 0.667 1
##   ..$ y: chr "a"
##   ..$ z: num 9

答案 2 :(得分:0)

看到列表的大小已经修复,这种情况下,简单的for循环也非常适合该任务。

for(i in seq_along(test)){ 
  test[[i]]$x <- test[[i]]$x / max(test[[i]]$x) 
}

我将其计时为比lapply解决方案慢0.8毫秒。