我有完全相同结构的列表列表,我想更改第二层中每个列表的一个元素。换句话说,我有一个对象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))
答案 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毫秒。