【问题标题】:R assign same value for all rows in column A if values are the same in columns B and C using loop如果使用循环在B列和C列中的值相同,R为A列中的所有行分配相同的值
【发布时间】:2021-07-18 09:55:57
【问题描述】:

请参阅下面我的原始数据集的一部分。

我想做的是比较行。 对于在“tezgnr150”和“KLASSE”中具有相同值的所有行,我想为“q347_ref”分配相同的值。因此它不应该取零值,而是取更大的数字。重要:我不想更改任何其他列值(例如“GWLNR”、“H1”)。

示例:由于我的数据集中的第 4 到 8 行都有“tezgnr150”= 120009 和“KLASSE”= 10,我希望它们都为“q347_ref”获得相同的值,方法是更改​​现在为零的值,到 98.4,因为这是具有相同 tezgnr150 和 KLASSE 的其他行已经具有的值。

有人可以帮我找到一个好的循环或代码吗? 非常感谢您!

 FID   tezgnr150 KLASSE NAMN       GWLNR        H1    H2       q347_ref
   
6322    120009      6 La Largue    N_A          37193 37194     98.4
6848    120009      6 La Largue    N_A          37193 37194     98.4
7885    120009      6 La Largue    N_A          37193 37194     98.4
4564    120009     10 Peute Goutte N_A          37193 37194     98.4
4737    120009     10 Le Dorfbach  N_A          37195 37196      0  
6849    120009     10 Peute Goutte CH0057310000 37193 37194     98.4
7889    120009     10 Le Dorfbach  CH0031350000 37195 37196      0  
686     120021      5 Albula       CH0002820000 34545 34678      0  
2247    120021      5 Albula       CH0002820000 34207 34682    819. 
3302    120021      5 Albula       CH0002820000 34646 34671      0    
3847    120021      5 Albula       CH0002820000 34663 34668       0 
4368    120021      5 Albula       CH0002820000 34548 34677       0 
4700    120021      5 Albula       CH0002820000 34654 34669       0 
4903    120021      5 Albula       CH0002820000 34653 34670       0 
5978    120021      5 Albula       CH0002820000 34627 34672       0 
8587    120021      5 Albula       CH0002820000 34207 34682     819.
8597    120021      5 Albula       CH0002820000 34614 34675       0  
10163   120021      5 Albula       CH0002820000 34664 34665       0 
10657   120021      5 Albula       CH0002820000 34664 34665       0 
367     120026      4 Rhein        CH0000010000 33490 37093     363.  
2991    120026      4 Rhein        CH0000010000 33520 33521       0 
2998    120026      4 Rhein        CH0000010009 33513 33518       0 
5127    120026      4 Rhein        CH0000010009 33513 33518       0 
7224    120026      4 Rhein        CH0000010000 33512 37090       0 
8811    120026      4 Rhein        CH0000010000 33490 37093     363.
10837   120026      4 Rhein        CH0000010000 33493 37092       0 
909     120026      9 Mulinbach    CH0033010000 33496 37091       0 
6182    120026      9 N_P          CH0033030000 33500 33509       0 
9321    120026      9 Mulinbach    CH0033010000 33506 33507       0 
908     120026     10 N_P          CH0033000000 33490 37093     363.

【问题讨论】:

  • 您能否提供您自己数据的前 5 或 10 行并显示预期的输出?现在听起来有点模糊。
  • 或者请您在这个给定的示例中提供预期的输出
  • 当然。所以如果第 1 行和第 2 行都应该有 sepal.length = 4.8 并且都有 sepal.width = 3.5,假设第 1 行有 petal.length = 1.5 而第 2 行有 petal.length = NA,那么我想要行2 在petal.length中取与第1行相同的值,所以1.5。

标签: r loops conditional-statements


【解决方案1】:

试试这个(在 cmets 中询问)

df %>% group_by(tezgnr150, KLASSE) %>% mutate(across(starts_with('q347'), ~max(.))

更新

df %>% group_by(tezgnr150, KLASSE) %>% mutate(q347_ref = max(q347_ref))
# A tibble: 30 x 8
# Groups:   tezgnr150, KLASSE [6]
     FID tezgnr150 KLASSE NAMN         GWLNR           H1    H2 q347_ref
   <int>     <int>  <int> <chr>        <chr>        <int> <int>    <dbl>
 1  6322    120009      6 La Largue    N_A          37193 37194     98.4
 2  6848    120009      6 La Largue    N_A          37193 37194     98.4
 3  7885    120009      6 La Largue    N_A          37193 37194     98.4
 4  4564    120009     10 Peute Goutte N_A          37193 37194     98.4
 5  4737    120009     10 Le Dorfbach  N_A          37195 37196     98.4
 6  6849    120009     10 Peute Goutte CH0057310000 37193 37194     98.4
 7  7889    120009     10 Le Dorfbach  CH0031350000 37195 37196     98.4
 8   686    120021      5 Albula       CH0002820000 34545 34678    819  
 9  2247    120021      5 Albula       CH0002820000 34207 34682    819  
10  3302    120021      5 Albula       CH0002820000 34646 34671    819
# ... with 20 more rows

如果有负值,你也可以这样做

df %>% group_by(tezgnr150, KLASSE) %>% mutate(q347_ref = mean(q347_ref[q347_ref != 0]))

# A tibble: 30 x 8
# Groups:   tezgnr150, KLASSE [6]
     FID tezgnr150 KLASSE NAMN         GWLNR           H1    H2 q347_ref
   <int>     <int>  <int> <chr>        <chr>        <int> <int>    <dbl>
 1  6322    120009      6 La Largue    N_A          37193 37194     98.4
 2  6848    120009      6 La Largue    N_A          37193 37194     98.4
 3  7885    120009      6 La Largue    N_A          37193 37194     98.4
 4  4564    120009     10 Peute Goutte N_A          37193 37194     98.4
 5  4737    120009     10 Le Dorfbach  N_A          37195 37196     98.4
 6  6849    120009     10 Peute Goutte CH0057310000 37193 37194     98.4
 7  7889    120009     10 Le Dorfbach  CH0031350000 37195 37196     98.4
 8   686    120021      5 Albula       CH0002820000 34545 34678    819  
 9  2247    120021      5 Albula       CH0002820000 34207 34682    819  
10  3302    120021      5 Albula       CH0002820000 34646 34671    819  
# ... with 20 more rows

较早的答案

我想你想要这样的东西

df <- read.table(text = "col1 col2 col3
1.5   0.2  1.3   
1.5   0.2  NA
1.4   0.3  1.6
1.7   0.3  1.7
1.6   1.2  NA
1.6   1.2  3.2", header = T)

df

  col1 col2 col3
1  1.5  0.2  1.3
2  1.5  0.2   NA
3  1.4  0.3  1.6
4  1.7  0.3  1.7
5  1.6  1.2   NA
6  1.6  1.2  3.2

library(tidyverse)
df %>% group_by(col1, col2) %>%
  mutate(col3 = mean(col3, na.rm = T))

# A tibble: 6 x 3
# Groups:   col1, col2 [4]
   col1  col2  col3
  <dbl> <dbl> <dbl>
1   1.5   0.2   1.3
2   1.5   0.2   1.3
3   1.4   0.3   1.6
4   1.7   0.3   1.7
5   1.6   1.2   3.2
6   1.6   1.2   3.2

【讨论】:

  • 不幸的是它没有用。我仍然在我想要值的地方得到了 NA。
  • 对不起,我现在更新了我的问题,希望现在更清楚了!
  • 我想替换零。在数据集中,每个 tezgnr150 和 KLASSE 对的值不应超过一个,这样它要么是值,要么是零。不确定是否最好将它们更改为 NA 的第一个?
  • 成功了,非常感谢!!! :) 最后一个问题,如果我想用更多的列而不只是 q347_ref,但以完全相同的方式......我怎么能遍历这些列?
  • 好的,这样对吗? : df %>% group_by(tezgnr150, KLASSE) %>% mutate(across(c(q347_ref, q347_2035, q347_2060, q347_2095), max))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2021-05-26
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
相关资源
最近更新 更多