簡體   English   中英

將 integer 轉換為 dplyr::if_else() 的數字/雙精度

[英]Convert integer to numeric/double for dplyr::if_else()

我有一個復雜的 if_else() 語句(參見第三個代碼塊),它有幾個新的 if_else 語句,它們都植根於“假”條件。 if_else() 要求真假條件中的類型相同。

出於某種原因,我不能強制一個簡單的 dataframe, chromSizes ,從 integer 到 numeric/double 以便類型一致。 轉換過程中不會拋出任何錯誤 - 它只是保持為 integer class。 我嘗試了多次迭代,包括lapplyas.numeric()as.double() 沒有任何效果。

在一個孤立的 if_else() 語句中,使用“0L”作為錯誤條件有效,而“0”會引發與我在復雜的 if_else() 語句中遇到的相同錯誤。 因此,將chromSizes轉換為 numeric/double 應該同樣解決我復雜的 if_else() 語句中的錯誤。 請參閱第二個代碼塊。 此外,如果我從 if_else() 語句中刪除這一行,代碼塊運行良好。

我也許可以使用 base::ifelse() function,但我寧願在整個聲明中繼續使用 if_else()。

chromSizes <- read.csv("sacCer3_chrom_sizes.csv", row.names=("Name"))
> chromSizes
         Length
chrIV   1531933
chrXV   1091291
chrVII  1090940
chrXII  1078177
chrXVI   948066
chrXIII  924431
chrII    813184
chrXIV   784333
chrX     745751
chrXI    666816
chrV     576874
chrVIII  562643
chrIX    439888
chrIII   316620
chrVI    270161
chrI     230218
chrM      85779

> str(chromSizes)
'data.frame':   17 obs. of  1 variable:
 $ Length: int  1531933 1091291 1090940 1078177 948066 924431 813184 784333 745751 666816 ...

> as.numeric(chromSizes$Length)
 [1] 1531933 1091291 1090940 1078177  948066  924431  813184  784333  745751  666816  576874  562643  439888  316620  270161  230218   85779

> str(chromSizes)
'data.frame':   17 obs. of  1 variable:
 $ Length: int  1531933 1091291 1090940 1078177 948066 924431 813184 784333 745751 666816 ...
> leading4 <- if_else(df.b$Chromosome_Strand == "-" & is.na(lead(df.b$Chromosome_Strand)), chromSizes[df.b$Chromosome,], 0)
Error: `false` must be an integer vector, not a double vector.

> leading5 <- if_else(df.b$Chromosome_Strand == "-" & is.na(lead(df.b$Chromosome_Strand)), chromSizes[df.b$Chromosome,], 0L)
> leading5 
[1]      0      0      0      0 576874
> SGD_YeastGenes7 <- SGD_YeastGenes %>%
+   dplyr::filter(Qualifier != "Dubious") %>% #Remove rows with Qualifier = Dubious
+   dplyr::mutate(ORFstart = if_else(Chromosome_Strand == "+", Chromosome_Start, Chromosome_Stop)) %>% #Define ORF bp start site
+   dplyr::arrange(Chromosome_Start) %>% #Sort by chromosome start position
+   dplyr::arrange(Chromosome) %>% #Sort by Chromosome number
+   dplyr::group_by(Chromosome) %>% #perform following operation only if chromosome numbers match
+   dplyr::mutate(UpstreamORF = if_else(Chromosome_Strand == "+" & is.na(lag(Chromosome_Strand)), 1,
+                                       if_else(Chromosome_Strand == "-" & is.na(lead(Chromosome_Strand)), chromSizes[Chromosome,],
+                                               if_else(Chromosome_Strand == "+" & lag(Chromosome_Strand == "+"), ORFstart - lag(Chromosome_Stop),
+                                                       if_else(Chromosome_Strand == "+" & lag(Chromosome_Strand == "-"), ORFstart - lag(ORFstart),
+                                                               if_else(Chromosome_Strand == "-" & lead(Chromosome_Strand == "+"), lead(ORFstart) - ORFstart,
+                                                                       if_else(Chromosome_Strand == "-" & lead(Chromosome_Strand == "-"), lead(Chromosome_Start) - ORFstart, 0)))))))
Error: Problem with `mutate()` input `UpstreamORF`.
x `false` must be an integer vector, not a double vector.
ℹ Input `UpstreamORF` is `if_else(...)`.
ℹ The error occurred in group 1: Chromosome = "chrI".
Run `rlang::last_error()` to see where the error occurred.

但是您沒有將數據框轉換為數字,至少在您提供的任何代碼中都沒有。 我會為你做的:

# Read in sample data
chromSizes <- read.table(header = TRUE, text = '
Length
chrIV   1531933
chrXV   1091291
chrVII  1090940
chrXII  1078177
chrXVI   948066
chrXIII  924431
chrII    813184
chrXIV   784333
chrX     745751
chrXI    666816
chrV     576874
chrVIII  562643
chrIX    439888
chrIII   316620
chrVI    270161
chrI     230218
chrM      85779')

# Convert to numeric
chromSizes$Length <- as.numeric(chromSizes$Length)

# Check and see that it is numeric
is.numeric(chromSizes$Length)
# [1] TRUE

然后if_else()應該工作:

library(dplyr)

# Sample data
df.b <- read.table(header = TRUE, text = '
Chromosome_Strand Chromosome
x          chrIV   
y          chrXV   
z          chrVII
-          chrXII  
a          chrXVI
b          chrXIII 
c          chrII
-          chrXIV')

# Run if_else condition with numeric 0 FALSE condition
leading4 <- if_else(df.b$Chromosome_Strand == "-", chromSizes[df.b$Chromosome,], 0)

# View results
leading4
# [1]       0       0       0 1078177       0       0       0  784333

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM