我提到堆栈溢出已经很久了,但这是我的第一篇文章。
我正在尝试将引用列表(来自年龄/性别归一化表)与评分值进行匹配。我生成了引用列表,并与以下代码的评分值相匹配:
#generate a simple dataframe
df<- data.frame("var1" = c(1,3,5,1))
#generate a list of raw values
n5<- seq(-16, -7.3, by=0.01)
n45<- seq(-7.29, -6.3, by = 0.01)
n4<- seq(-6.29, -5.2, by = 0.01)
n35<- seq(-5.19, -4.2, by = 0.01)
n3<- seq(-4.19, -3.2, by = 0.01)
n25<- seq(-3.19, -2.2, by = 0.01)
n2<- seq(-2.19, -1.1, by = 0.01)
n15<- seq(-1.09,-0.01, by = 0.01)
n1<- seq(0, 0.9, by = 0.01)
n05<- seq(0.91, 2, by = 0.01)
p0<- seq(2.01, 3, by = 0.01)
p05<- seq(3.01, 4, by = 0.01)
p1<- seq(4.01,5.1, by = 0.01)
p15<- seq(5.11, 6.1, by = 0.01)
p2<- seq(6.11,7.1, by = 0.01)
p25<- seq(7.11,8.2, by = 0.01)
p3<- seq(8.21, 9.2, by = 0.01)
p35<- seq(9.21, 10.2, by = 0.01)
p4<- seq(10.21, 11.2, by = 0.01)
p45<- seq(11.21,12.3, by = 0.01)
p5<- seq(12.31,16, by = 0.01)
#generate a list of standard scores
m1 <- list(
c(-5, n5),
c(-4.5, n45),
c(-4,n4),
c(-3.5,n35),
c(-3, n3),
c(-2.5, n25 ),
c(-2, n2),
c(-1.5,n15),
c(-1,n1),
c(-0.5,n05),
c(0,p0),
c(0.5, p05),
c(1, p1),
c(1.5,p15),
c(2,p2),
c(2.5, p25),
c(3, p3),
c(3.5, p35),
c(4, p4),
c(4.5, p45),
c(5, p5))
#matching
lapply(m1, function(x) {
df$std_var1[df$var1 %in% x] <<- x[[1]]})
#duplicates the original value instead of matching
#forced number of digits from 0 to 2; matches with NA
df$var1r<-sprintf("%0.2f", df$var)
lapply(m1, function(x) {
df$std_var1r[df$var1r %in% x] <<- x[[1]]})虽然这种方法适用于我拥有的大多数变量,但相同的代码只是简单地复制了几个变量的原始值,而不是根据我生成的引用列表进行匹配。我试图更改数字和数字格式,但我不明白为什么代码对某些变量有效,而对其他变量无效。任何可供选择的方法都将非常受欢迎。
这是一张桌子的截图。匹配的值已写成供您参考。第一列和第二列相同,但数字不同。第三列是应该匹配的标准化数字,但复制了原始值,而不是替换为匹配值。
df: EDIT:删除的屏幕截图
更新(06/15/20):
以下表格供您参考(原始-原始值;实际-实际匹配结果;预期-预期匹配结果)
*Original | Actual | Expected |*
1 | 1 | -0.5
3 | 3 | 0
5 | 5 | 1
1 | 1 | -0.5 如果原始值有数字,则同样的方法也适用于预期的匹配结果。请参考下面的代码:
#generate a simple dataframe
df.2<- data.frame("var2" = c(1.40, 1.52, 3.21, 5.10))
#subject cluster bidirectional chance adjusted
n3<- seq(-1.90, -1.50, by = 0.001)
n25<- seq(-1.49, -1.10, by = 0.001)
n2<- seq(-1.09, -0.70, by = 0.001)
n15<- seq(-0.69, -0.30, by = 0.001)
n1<- seq(-0.29, 0.10, by = 0.001)
n05<- seq(0.11, 0.60, by = 0.001)
p0<- seq(0.61, 1.00, by = 0.001)
p05<- seq(1.01, 1.40, by = 0.001)
p1<- seq(1.41, 1.80, by = 0.001)
p15<- seq(1.81, 2.20, by = 0.001)
p2<- seq(2.21,2.6, by = 0.001)
p25<- seq(2.61, 3.1, by = 0.001)
p3<- seq(3.11, 3.5, by = 0.001)
p35<- seq(3.51, 3.9, by = 0.001)
p4<- seq(3.91, 4.3, by = 0.001)
p45<- seq(4.4,4.7, by = 0.001)
p5<- seq(4.71,14.1, by = 0.001)
##
m2 <- list(
c("-3",n3),
c("-2.5", n25),
c("-2",n2),
c("-1.5", n15),
c("-1", n1),
c("-0.5", n05),
c("0", p0),
c("0.5", p05),
c("1", p1),
c("1.5", p15),
c("2", p2),
c("2.5", p25),
c("3", p3),
c("3.5",p35),
c("4",p4),
c("4.5", p45),
c("5", p5))
#sub clust bi chance adj (t1-5)
lapply(m2, function(x) {
df.2$std_var2r[df.2$var2 %in% x] <<- x[[1]]})
#matching worked
#var2 std_var2r
#1.40 0.5
#1.52 1
#3.21 3
#5.10 5其中一个回复表明我可能遇到了浮动框问题,但我似乎找不到解决方案。任何指导都将不胜感激。
发布于 2020-06-13 08:48:16
我没有得到你想要的东西,但是当你把df$std_var1[df$var1 %in% x] <<- x[[1]]和lapply进行匹配时,只有最后一个匹配到list m1 term的元素才能继续存在,因为最后一个x[1]会覆盖之前的元素。让我们看看df$var1 %in% x
> lapply(m1, function(x) {
+ df1$var1 %in% x})
[[1]]
[1] FALSE FALSE FALSE FALSE
[[2]]
[1] FALSE FALSE FALSE FALSE
[[3]]
[1] FALSE FALSE FALSE FALSE
[[4]]
[1] FALSE FALSE FALSE FALSE
[[5]]
[1] FALSE FALSE FALSE FALSE
[[6]]
[1] FALSE FALSE FALSE FALSE
[[7]]
[1] FALSE FALSE FALSE FALSE
[[8]]
[1] FALSE FALSE FALSE FALSE
[[9]]
[1] FALSE FALSE FALSE FALSE
[[10]]
[1] TRUE FALSE FALSE TRUE
[[11]]
[1] FALSE TRUE FALSE FALSE
[[12]]
[1] FALSE FALSE FALSE FALSE
[[13]]
[1] TRUE FALSE TRUE TRUE
[[14]]
[1] FALSE FALSE FALSE FALSE
[[15]]
[1] FALSE FALSE FALSE FALSE
[[16]]
[1] FALSE FALSE FALSE FALSE
[[17]]
[1] FALSE TRUE FALSE FALSE
[[18]]
[1] FALSE FALSE FALSE FALSE
[[19]]
[1] FALSE FALSE FALSE FALSE
[[20]]
[1] FALSE FALSE FALSE FALSE
[[21]]
[1] FALSE FALSE TRUE FALSE对于要创建到df中的新列std_var1的第一个和第四个元素,[[13]]给出了最后一个TRUE,因为m1[[13]]是c(1, p1),因此是x[[1]] = 1,这个1被分配给df$std_var1的第1行和第4行。第二个位置的最后一个真出现在x= m1[17]时,第三个位置出现在x= m1[21]时,这是c(3, p3)和c(3, p5),因此x[1]分别为3和5,从而得到'df$std_var1 = c(1,3,5,1)。
所以代码并没有像您期望的那样工作,但是我不知道预期的结果是什么。
发布于 2020-06-17 05:44:18
找到了问题的解决方案。如果我更改匹配以排除向量中的第一个值,它可以正常工作。
旧: lapply(m1,function(x) {%x中的df$std_var1df$var1 % <<- x[1]})
新增: lapply(m1,function(x) {df$std_var1[df$var1%in% x-1] <<- x[1]})
https://stackoverflow.com/questions/62350947
复制相似问题