[英]Convert integer to numeric/double for dplyr::if_else()
我有一個復雜的 if_else() 語句(參見第三個代碼塊),它有幾個新的 if_else 語句,它們都植根於“假”條件。 if_else() 要求真假條件中的類型相同。
出於某種原因,我不能強制一個簡單的 dataframe, chromSizes
,從 integer 到 numeric/double 以便類型一致。 轉換過程中不會拋出任何錯誤 - 它只是保持為 integer class。 我嘗試了多次迭代,包括lapply
、 as.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.