映射功能以遍历列表

时间:2020-06-23 06:03:55

标签: r

用户

Insert row/s of NAs on the Nth row to list of data.frames with N from list中,我获得了有关使用循环和Map函数的帮助。在获得那里的帮助之后,我目前正在尝试解决类似的问题-但我再次陷入困境(经过一段时间在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_x中的行list_zposition中的行数替换list_x中的行来替换Map(function(x,y,z){for(i in y){x[i,]<-z[i,]};x},x=list_x,y=position,z=list_z) 数据帧中的NA行。我尝试使用以下功能:

list_x

此函数仅更改第n行position指定的position的每个df中的第一行号。我希望它更改list_z指定的所有行。另一种选择是,由于list_xlist_z中的行是相同的顺序(list_x中的dfs的第一行转到list_x中的dfs的第一行,因此on),将是用list_x中的行替换position中的NA行的函数。这样的功能将使{{1}}不必要。

我必须提到,要替换的行数在数据帧之间会有所不同。

最良好的祝愿/约翰

1 个答案:

答案 0 :(得分:0)

单线可做:

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

请注意,以上第二行很重要,它对应于x指令中分号后的Map。必须将data.frame x返回给调用方,否则,它只能在Map所调用的匿名函数内更改。