用户
在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_z
用position
中的行数替换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_x
和list_z
中的行是相同的顺序(list_x
中的dfs的第一行转到list_x
中的dfs的第一行,因此on),将是用list_x
中的行替换position
中的NA行的函数。这样的功能将使{{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
所调用的匿名函数内更改。