【问题标题】:Map function to iterate over list映射函数以迭代列表
【发布时间】:2020-06-23 06:03:55
【问题描述】:

用户,

Insert row/s of NAs on the Nth row to list of data.frames with N from list 中,我收到了有关循环使用和地图功能的帮助。在我在那里获得帮助之后,我目前正在尝试解决类似的问题 - 但我再次陷入困境(在 SO 和其他地方花费时间搜索之后)

这里有一些示例数据来说明我的问题:

df_z_one <- data.frame(1:2,4:5,7:8)
df_z_two <- data.frame(10:11,13:14,16:17)
list_z <- list(df_z_one,df_z_two)
df_x_one <- data.frame(c(NA,1,NA),c(NA,2,NA),c(NA,3,NA))
df_x_two <- data.frame(c(2,NA,NA),c(3,NA,NA),c(4,NA,NA))
list_x <- list(df_x_one,df_x_two)
position <- list(c(1,3),c(2,3))

我需要的是一个函数,它用来自list_z 的行替换list_x 的数据帧中的行,positionlist_x 的dfs 中指定行号。我尝试了以下功能:

Map(function(x,y,z){for(i in y){x[i,]<-z[i,]};x},x=list_x,y=position,z=list_z)

此函数仅更改第 n 行上 list_x 的每个 df 中的第一个行号(由 position 指定)。我希望它更改position 指定的所有行。另一种选择是,由于list_zlist_x 中的行顺序相同(list_z 中的第一行 dfs 转到list_x 中的第一行 dfs,依此类推),这将是一个函数用来自list_x 的行替换list_x 中的NA 行。这样的功能会使positionunnecessary。

我必须提到,要替换的行数会因数据帧而异。

最好的祝愿/约翰

【问题讨论】:

  • 你能显示你的预期输出吗?

标签: r


【解决方案1】:

单线就可以了:

Map(function(x, z, i) {x[i, ] <- z; x}, list_x, list_z, position)
#[[1]]
#  c.NA..1..NA. c.NA..2..NA. c.NA..3..NA.
#1            1            4            7
#2            1            2            3
#3            2            5            8
#
#[[2]]
#  c.2..NA..NA. c.3..NA..NA. c.4..NA..NA.
#1            2            3            4
#2           10           13           16
#3           11           14           17

诀窍是看看如何处理列表的成员之一,然后尝试概括该代码:

df_x_one[position[[1]],] <- df_z_one
df_x_one

注意上面的第二行很重要,它对应于Map指令中分号后的x。 data.frame x 必须返回给调用者,否则它只会在Map 调用的匿名函数内部发生变化。

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2014-02-19
    • 1970-01-01
    • 2015-02-11
    • 2021-03-03
    • 1970-01-01
    • 2018-08-29
    • 2021-11-10
    • 2023-01-23
    相关资源
    最近更新 更多