首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表中的数值在R中的lapply函数中不能正确匹配?

列表中的数值在R中的lapply函数中不能正确匹配?
EN

Stack Overflow用户
提问于 2020-06-13 03:12:47
回答 2查看 59关注 0票数 0

我提到堆栈溢出已经很久了,但这是我的第一篇文章。

我正在尝试将引用列表(来自年龄/性别归一化表)与评分值进行匹配。我生成了引用列表,并与以下代码的评分值相匹配:

代码语言:javascript
复制
#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):

以下表格供您参考(原始-原始值;实际-实际匹配结果;预期-预期匹配结果)

代码语言:javascript
复制
*Original  | Actual  | Expected   |*
 1         |   1     |   -0.5
 3         |   3     |    0
 5         |   5     |    1
 1         |   1     |   -0.5 

如果原始值有数字,则同样的方法也适用于预期的匹配结果。请参考下面的代码:

代码语言:javascript
复制
#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

其中一个回复表明我可能遇到了浮动框问题,但我似乎找不到解决方案。任何指导都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 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

代码语言:javascript
复制
> 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)。

所以代码并没有像您期望的那样工作,但是我不知道预期的结果是什么。

票数 0
EN

Stack Overflow用户

发布于 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]})

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62350947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档