R 在应用函数中返回数字(0)

R 在应用函数中返回数字(0),r,apply,R,Apply,我有两个简单的数据帧A和B: A<-data.frame(V1=c(0.25,0.5,0.75,1),V2=c("a","b","c","d")) B<-data.frame(V2=c(1,2,3,4)) rownames(B)=c(0.25,0.5,0.75,1) 现在A看起来像这样: V1 V2 V3 1 0.25 a 1 2 0.50 b 3 0.75 c 3 4 1.00 d 仅当我再次运行同一命令时,“2”和“4”才会显示在第3列中:

我有两个简单的数据帧A和B:

 A<-data.frame(V1=c(0.25,0.5,0.75,1),V2=c("a","b","c","d"))
 B<-data.frame(V2=c(1,2,3,4))
 rownames(B)=c(0.25,0.5,0.75,1)
现在A看起来像这样:

    V1 V2 V3
1 0.25  a  1
2 0.50  b 
3 0.75  c  3
4 1.00  d   
仅当我再次运行同一命令时,“2”和“4”才会显示在第3列中:

    V1 V2 V3
1 0.25  a  1
2 0.50  b  2
3 0.75  c  3
4 1.00  d  4
如果只运行一次,它似乎会在第2行和第4行返回数字(0)。我尝试删除A中的V2列,并只运行一次命令。一切都很好。没有值丢失


有人知道为什么第2行和第4行中缺少这些值吗

问题是,当以这种方式使用
apply
时,您正在比较字符串,而不是数字

注意打印的内容

z = apply(A,1,function(x){
    print("Next")
    print(rownames(B))
    print(x[1])
    })

[1] "Next"
[1] "0.25" "0.5"  "0.75" "1"
    V1
"0.25"
[1] "Next"
[1] "0.25" "0.5"  "0.75" "1"
    V1
"0.50"
[1] "Next"
[1] "0.25" "0.5"  "0.75" "1"
    V1
"0.75"
[1] "Next"
[1] "0.25" "0.5"  "0.75" "1"
    V1
"1.00"

"0.5" == "0.50"
[1] FALSE
因此,您可能需要首先正确地转换为
数值。这三种方法中的任何一种都有效:

A$V3 = apply(A,1,function(x){return(B[rownames(B)==as.numeric(x[1]),1])})
A$V3[match(rownames(B), A[,1])] = B[,1]
A$V3 = sapply(A[,1], function(x){return(B[rownames(B)==x[1],1])})

这是一个需要
dplyr
tibble
的解决方案。首先,我定义数据帧

# Define data frames
A<-data.frame(V1=c(0.25,0.5,0.75,1),V2=c("a","b","c","d"))
B<-data.frame(V2=c(1,2,3,4))
rownames(B)=c(0.25,0.5,0.75,1)

谢谢。我认为rownames(B)是字符串,所以我尝试将as.character()用于x[1],以便它们可以比较。我不知道这是另一种方式。现在我知道了。再次感谢。
# Define data frames
A<-data.frame(V1=c(0.25,0.5,0.75,1),V2=c("a","b","c","d"))
B<-data.frame(V2=c(1,2,3,4))
rownames(B)=c(0.25,0.5,0.75,1)
B %>% 
  rownames_to_column(var = "V1") %>% 
  mutate(V1 = as.numeric(V1)) %>% 
  right_join(A, by = "V1")

#     V1 V2.x V2.y
# 1 0.25    1    a
# 2 0.50    2    b
# 3 0.75    3    c
# 4 1.00    4    d