在r中递增地追加列表

在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

我有以下问题: 我有两个数据帧: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          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所建议的那样,效果非常好!非常感谢,我的方法太复杂了谢谢,如果你愿意的话,请向上投票-我是新来的!它工作得非常好!非常感谢,我的方法太复杂了谢谢,如果你愿意的话,请向上投票-我是新来的!我按照你建议的方式试过了,遗憾的是计算时间仍然非常慢。谢谢你的建议!我按照你建议的方式试过了,遗憾的是计算时间仍然非常慢。谢谢你的建议!