R 在新列中获取所有NAs[变异]
我需要创建一个新列,它是两个或三个其他列的函数,其中一个包含一些丢失的数据(NAs)。但是,当我使用R 在新列中获取所有NAs[变异],r,dplyr,na,missing-data,R,Dplyr,Na,Missing Data,我需要创建一个新列,它是两个或三个其他列的函数,其中一个包含一些丢失的数据(NAs)。但是,当我使用dplyr的mutate函数时,新列包含所有NAs 请参见下面的示例: rand_df <- data.frame(replicate(10,sample(0:10,200,rep=TRUE))) # random df names(rand_df) <- letters[seq(from=1, to=10)] #renaming header rand_df$c[2:20] <
dplyr
的mutate
函数时,新列包含所有NAs
请参见下面的示例:
rand_df <- data.frame(replicate(10,sample(0:10,200,rep=TRUE))) # random df
names(rand_df) <- letters[seq(from=1, to=10)] #renaming header
rand_df$c[2:20] <- NA # introducing NAs
head(rand_df)
a b c d e f g h i j
1 3 1 8 2 4 3 1 9 2 9
2 6 1 NA 1 2 8 8 6 0 9
3 5 7 NA 2 4 1 7 7 3 0
4 10 8 NA 6 6 7 0 2 2 0
5 4 1 NA 9 3 8 2 2 5 2
6 10 8 NA 3 10 2 10 4 5 5
rand_df您可以使用pmin()
库(dplyr)
兰德迪夫2 7 3 NA 2 5 9 1 2 10 6
#>303NA45610106
#>407NA 5366947
#>5 4 4 NA 5 4 10 8 5 6 0
#>613NA30101374
rand_df%突变(k=141*pmin((c/88.42),1))
头部(兰特迪夫)
#>a b c d e f g h i j k
#> 1 4 9 9 6 10 2 1 10 10 10 14.35196
#>2 7 3 NA 2 5 9 1 2 10 6 NA
#>3003NA 45610106NA
#>407NA 5366947NA
#>5 4 4 NA 5 4 10 8 5 6 0 NA
#>613NA 30101374NA
由[reprex软件包]于2020-08-17创建(https://reprex.tidyverse.org)(v0.3.0)
似乎在ifelse()函数中添加了额外的参数。我的意思是33.5
在这里是不必要的
另外,下一次,请确保正确询问(根据本指南)以下代码行失败,因为min((c/88.42),1))
不基于每一行进行计算,而是使用整个列,因此重复相同的值:
rand_df <- rand_df %>% mutate(k = 141 * min((c/88.42), 1))
解决此问题的方法有多种,其中一种是将行号添加为列,然后使用group_by:
rand_df %>%
mutate(row = row_number()) %>%
group_by(row) %>%
mutate(k = 141 * min((c/88.42), 1))
谢谢。我用一个可复制的例子编辑了这个问题。我希望现在更清楚了。非常感谢。我对问题进行了编辑以使其更清晰。@janderkran,我用OP提供的新数据集编辑了您的答案,看起来很正确。对于OP,问题+相关数据越精确,获得快速答案的机会就越大。在新版本的dplyr
,rowwise()
不用耍花招就能做到这一点。我还以为他们已经放弃了呢?不管怎样,你每天都会学到一些新的东西……我想他们几年前试图摆脱它,但它得到了一些新的爱(而且可能做得更好并不容易),所以它实际上在dplyr 1.0中得到了推广。最近的观点见此:@RobertWilson非常感谢您的澄清。我的实际目标是简单地找到最小的b/wc/88.42
和1,我认为pmin
就是这样做的。我之前不明白@janderkran的回答,但现在我明白了。
rand_df <- rand_df %>% mutate(k = 141 * min((c/88.42), 1))
rand_df %>% mutate(k = min(f), k1 = max(f)))
rand_df %>%
mutate(row = row_number()) %>%
group_by(row) %>%
mutate(k = 141 * min((c/88.42), 1))