R 在应用函数中返回数字(0)
我有两个简单的数据帧A和B: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<-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