我有这个数据框架(df),当"ID“列与给定向量(ID向量)的值匹配时,我需要得到列"amountN”中值的向量,所以我创建了一个for循环,通过打印df$工程量N的值来检查它们是否真的完成了df$ID条件,并且它们确实完成了。这是for循环:
df
amountS amountN ID
64693 0.440 0.55 028
64702 0.360 0.52 028
64708 0.220 0.33 028
64714 0.500 0.27 028
64720 0.280 0.51 028
64726 0.520 0.47 028
64732 0.410 0.25 028
64735 0.090 0.11 028
64741 0.220 0.17 028
64750 0.630 0.48 028
64756 0.430 0.35 028
64762 1.200 0.40 028
65150 4.425 14.95 029
65156 5.035 23.60 029
65163 5.810 26.20 029
idvector <- c("010","025","028")
for(i in seq_len(nrow(df))){
for (j in seq_len(length(idvector))){
if(df$ID[i] == idvector[j]){
print(df$amountN[i])
}
}
}到现在为止还好。但是,我尝试了很多方法,通过更改最后一行中的函数print(),将这些值转换为向量,但是似乎没有什么效果:
for(i in seq_len(nrow(df))){
for (j in seq_len(length(idvector))){
if(df$ID[i] == idvector[j]){
x <- c(df$amountN[i])
}
x
}
}我还试图从subset库和select库中获取df$工程量N的子集,然后使用dplyr和select将数据转换为向量,但也没有得到,而是获得NULL:
for(i in seq_len(nrow(df))){
for (j in seq_len(length(idvector))){
if(df$ID[i] == idvector[j]){
x <- subset(df$amountN[i,])
}
x
}
}我查看了这些数据并注意到这些值如下所示:
[1] 0.55
[1] 0.52
[1] 0.33
[1] 0.27
[1] 0.51
[1] 0.47
[1] 0.25
[1] 0.11
[1] 0.17
[1] 0.48
[1] 0.35
[1] 0.4它们应该是这样的:
[1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48
[11] 0.35 0.40我确实需要一个向量或一个子集,这样我就可以将摘要统计和其他统计数据应用到数据中,但还没有弄清楚。
我使用的是R版本4.0.3
发布于 2020-12-05 22:09:27
在base R中,我们可以更容易地使用subset完成这一任务。
subset(df, ID %in% idvector, select = amountN)$amountN
#[1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48 0.35 0.40对于OP的代码,我们可以将'x‘定义为NULL向量,然后在每个循环中连接'x’,并将其赋值给'x‘。此外,请确保“idvector”是相同类型的,即假设它也是数字的。
x <- c()
for(i in seq_len(nrow(df))){
for (j in seq_len(length(idvector))){
if(df$ID[i] == idvector[j]){
x <- c(x, df$amountN[i])
}
x
}
}-output
x
#[1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48 0.35 0.40注意:OP代码中的问题是每次迭代时都会更新“x”,同时删除前面的输出。它需要连接
数据
df <- structure(list(amountS = c(0.44, 0.36, 0.22, 0.5, 0.28, 0.52,
0.41, 0.09, 0.22, 0.63, 0.43, 1.2, 4.425, 5.035, 5.81), amountN = c(0.55,
0.52, 0.33, 0.27, 0.51, 0.47, 0.25, 0.11, 0.17, 0.48, 0.35, 0.4,
14.95, 23.6, 26.2), ID = c(28L, 28L, 28L, 28L, 28L, 28L, 28L,
28L, 28L, 28L, 28L, 28L, 29L, 29L, 29L)), class = "data.frame",
row.names = c("64693",
"64702", "64708", "64714", "64720", "64726", "64732", "64735",
"64741", "64750", "64756", "64762", "65150", "65156", "65163"
))
idvector <- c(10, 25, 28)发布于 2020-12-05 22:13:40
您可以直接避免使用%in%之上的df和索引来避免循环ans:
#Code
vec <- df$amountN[df$ID %in% idvector]输出:
[1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48 0.35 0.40https://stackoverflow.com/questions/65162498
复制相似问题