我有一个相当大的位置和关联点的数据集。所有的点和位置都是索引值。我试图以简洁的方式将索引值从另一个df转换为位置代码,同时保留"na“值。这是我尝试过的。
a <- c(1,2,3,5, "na", "na")
b <- c(2,1,5,7,3,6)
c <- c(3,6,2,4,1,"na")
df <- rbind(a,b,c)
df <- as.data.frame(df)
d <- c(1,2,3,4,5,6,7,8)
e <- c(0115,0116,1117,1119,1237,1456,1901,2135)
df2 <- cbind(d,e)
df2 <- as.data.frame(df2)
test <- lapply(df[2:6], function(x){ifelse(x %in% df2$d, df2$e, "na")})结果是在第一列关联值的行之间重复值。有什么办法解决这个问题吗。显然,我不明白我是如何应用函数的。
发布于 2021-06-26 15:21:22
在数据中使用NA而不是"na“。
df3 <- melt(df, id.var = "V1", value.name = "d")
merge(df3, df2, by = "d", all = TRUE)
# d V1 variable e
# 1 1 3 V5 115
# 2 1 2 V2 115
# 3 2 1 V2 116
# 4 2 3 V3 116
# 5 3 1 V3 1117
# 6 3 2 V5 1117
# 7 4 3 V4 1119
# 8 5 2 V3 1237
# 9 5 1 V4 1237
# 10 6 3 V2 1456
# 11 6 2 V6 1456
# 12 7 2 V4 1901
# 13 8 NA <NA> 2135
# 14 NA 1 V6 NA
# 15 NA 1 V5 NA
# 16 NA 3 V6 NA数据
df <- structure(list(V1 = c(1, 2, 3), V2 = c(2, 1, 6), V3 = c(3, 5,
2), V4 = c(5, 7, 4), V5 = c(NA, 3, 1), V6 = c(NA, 6, NA)), .Names = c("V1",
"V2", "V3", "V4", "V5", "V6"), row.names = c("a", "b", "c"), class = "data.frame")
df2 <- structure(list(d = c(1, 2, 3, 4, 5, 6, 7, 8), e = c(115, 116,
1117, 1119, 1237, 1456, 1901, 2135)), .Names = c("d", "e"), row.names = c(NA,
-8L), class = "data.frame")使用lapply的
lapply(df[2:6], function(x){
y <- which(!is.na(x))
x[y] <- df2$e[na.omit(x)]
# x[y] <- df2$e[df2$d[na.omit(x)]] # using d
return(x)
})
# $V2
# [1] 116 115 1456
#
# $V3
# [1] 1117 1237 116
#
# $V4
# [1] 1237 1901 1119
#
# $V5
# [1] NA 1117 115
#
# $V6
# [1] NA 1456 NAhttps://stackoverflow.com/questions/68143596
复制相似问题