在r中递增地追加列表
我有以下问题: 我有两个数据帧:kl_df和IDlist在r中递增地追加列表,r,dataframe,R,Dataframe,我有以下问题: 我有两个数据帧:kl_df和IDlist head(kl_df) STATIONS_ID MESS_DATUM QN_3 FX FM QN_4 RSK RSKF SDK SHK_TAG NM VPM PM TMK UPM TXK TNK TGK eor 1 73 2000-01-01 NA NA NA 10 2.9 7 0.0 6 8.0 5.6 NA -0.2 94 0.7 -1.7 -2.1 eor 2
head(kl_df)
STATIONS_ID MESS_DATUM QN_3 FX FM QN_4 RSK RSKF SDK SHK_TAG NM VPM PM TMK UPM TXK TNK TGK eor
1 73 2000-01-01 NA NA NA 10 2.9 7 0.0 6 8.0 5.6 NA -0.2 94 0.7 -1.7 -2.1 eor
2 73 2000-01-02 NA NA NA 10 0.0 0 1.6 5 7.3 6.2 NA 0.8 92 4.0 -1.4 -0.1 eor
3 73 2000-01-03 NA NA NA 10 0.0 0 0.0 0 8.0 5.7 NA -0.2 95 0.6 -1.3 -1.5 eor
4 73 2000-01-04 NA NA NA 10 0.8 8 0.8 0 7.7 5.9 NA 1.2 89 2.6 -0.4 -1.0 eor
5 73 2000-01-05 NA NA NA 10 0.0 0 1.1 0 5.7 6.6 NA 1.4 93 6.1 -0.7 0.0 eor
6 73 2000-01-06 NA NA NA 10 0.0 0 0.0 0 8.0 6.0 NA 0.1 98 1.4 -1.0 -1.0 eor
head(IDlist)
Stations_id von_datum bis_datum Stationshoehe geoBreite geoLaenge Stationsname Bundesland res
194 15 19510101 20190331 390 49.2346 10.9668 Abenberg Bayern annual
306 29 19510101 20190527 260 49.7175 10.9101 Adelsdorf (Klaeranlage) Bayern daily
485 46 19370101 20190528 325 48.9450 12.4639 Aholfing Bayern annual
606 55 19370101 20190528 509 47.8780 12.0239 Aibling, Bad-Ellmosen Bayern annual
684 63 19510101 20190527 747 47.8172 10.5374 Aitrang Bayern daily
857 73 19080101 20190528 340 48.6159 13.0506 Aldersbach-Kriestorf Bayern annual
var per hasfile
194 more_precip historical TRUE
306 more_precip historical TRUE
485 more_precip historical TRUE
606 more_precip historical TRUE
684 more_precip historical TRUE
857 more_precip historical TRUE
IDlist包含与stations_id相关的唯一行,而重复行在kl_df中。
现在,我的目标是将正确的站点ID的变量“Stationshoehe”、“Geobrete”、“geoLaenge”附加到kl_df
我试着写一个函数。该函数的思想是迭代kl_df,对于每次迭代,遍历IDlist$Stations_id以匹配id号。然后,将所需变量写入列表:
getcoords = function(){
results=list()
for (ID in kl_df$STATIONS_ID) {
counter = 1
for (i in IDlist$Stations_id){
if (ID == i) {
print(counter)
append(results, values= c(IDlist$Stationshoehe[counter], IDlist$geoBreite[counter], IDlist$geoLaenge[counter]))
next
}
else {
counter = counter+1
print(counter)
}
}
}
return(results)
}
datlist = getcoords()
但它只返回一个空列表。。。
打印(计数器)
行用于在线测试。问题是计数器总是从1计数到长度(IDlist$Stations\u id)。
打印示例:
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
问题:如何修复功能,或者是否有更好的方法来实现目标?
多谢各位 写作怎么样:
results=append(results, values= c(IDlist$Stationshoehe[counter], IDlist$geoBreite[counter], IDlist$geoLaenge[counter]))`
在if(ID==i)
块中
R永远不会修改传递给函数的参数,append
将返回添加新元素的列表,但您需要将其存储在某个位置(请参阅)
当您说:问题是计数器总是从1计数到长度(IDlist$Stations\u id),这是代码的预期行为。如果您想在找到匹配的IDlist$Stations\u id
后立即停止,请将next
(此处无效,因为在这种情况下将不执行else
)更改为中断
如何写入:
results=append(results, values= c(IDlist$Stationshoehe[counter], IDlist$geoBreite[counter], IDlist$geoLaenge[counter]))`
在if(ID==i)
块中
R永远不会修改传递给函数的参数,append
将返回添加新元素的列表,但您需要将其存储在某个位置(请参阅)
当您说:问题是计数器总是从1计数到长度(IDlist$Stations\u id),这是代码的预期行为。如果您想在找到匹配的
IDlist$Stations\u id
后立即停止,请将next
(此处无效,因为在这种情况下,else
不会执行)更改为break
如果我正确理解了问题,您想进行“左连接”按列STATIONS\u ID
选择数据帧kl_df
和IDlist
,然后从连接的数据帧中选择感兴趣的列
下面,我创建了两个数据框的一个更简单的版本-在左连接之后,您应该能够调整select
语句,以便只保留连接的数据框中感兴趣的列
> kl_df <- data.frame(STATIONS_ID=c(1,1,2,2), col_a=c(1,2,3,4), col_b=c(10,15,12,8))
> kl_df
STATIONS_ID col_a col_b
1 1 1 10
2 1 2 15
3 2 3 12
4 2 4 8
> IDlist <- data.frame(Stations_id=c(1,2,3), col_c=c(10,20,10), col_d=c(99,97,90))
> IDlist
Stations_id col_c col_d
1 1 10 99
2 2 20 97
3 3 10 90
请注意,
dplyr
包中的连接函数比使用merge
或for循环快得多。如果我正确理解了这个问题,您希望通过IDlist
按列STATIONS\u ID
对数据帧进行“左连接”kl_df
,然后从关联的数据框中选择感兴趣的列
下面,我创建了两个数据框的一个更简单的版本-在左连接之后,您应该能够调整select
语句,以便只保留连接的数据框中感兴趣的列
> kl_df <- data.frame(STATIONS_ID=c(1,1,2,2), col_a=c(1,2,3,4), col_b=c(10,15,12,8))
> kl_df
STATIONS_ID col_a col_b
1 1 1 10
2 1 2 15
3 2 3 12
4 2 4 8
> IDlist <- data.frame(Stations_id=c(1,2,3), col_c=c(10,20,10), col_d=c(99,97,90))
> IDlist
Stations_id col_c col_d
1 1 10 99
2 2 20 97
3 3 10 90
请注意,
dplyr
包中的连接函数比使用merge
或for循环快得多。是否尝试合并数据帧<代码>合并(kl_-df,IDlist,by.x=“STATIONS_-ID”,by.y=“STATIONS_-ID”)还要检查一下如何生成一个。啊,是的,我会的。我在这里的第一篇文章。我按照下面的建议与dplyr进行了合并您尝试合并数据帧了吗<代码>合并(kl_-df,IDlist,by.x=“STATIONS_-ID”,by.y=“STATIONS_-ID”)还要检查一下如何生成一个。啊,是的,我会的。我在这里的第一篇文章。我与dplyr进行了合并,正如belowIt所建议的那样,效果非常好!非常感谢,我的方法太复杂了谢谢,如果你愿意的话,请向上投票-我是新来的!它工作得非常好!非常感谢,我的方法太复杂了谢谢,如果你愿意的话,请向上投票-我是新来的!我按照你建议的方式试过了,遗憾的是计算时间仍然非常慢。谢谢你的建议!我按照你建议的方式试过了,遗憾的是计算时间仍然非常慢。谢谢你的建议!