我在資料框中有一個字符變數,并且想根據該字符變數中特定字串的存在在該資料框中創建一個新的數字變數。
我想出了一種方法來做到這一點,但想知道是否有比我這里更快或更優雅的方法。
這是我的解決方案,使用 ifelse 和 substr:
首先,我的字符變數的每個觀察值都是隨機的一系列數字和字母(從 0-9 和 AZ)。我將在下面創建一個示例變數:
library(stringi)
set.seed(100)
my.df<-data.frame("V1"=sprintf("%s%s%s", stri_rand_strings(10, 5, c('[A-B]','[0-2]')),
stri_rand_strings(10, 4, c('[0-9]','[A-J]')), stri_rand_strings(10, 1, '[A-Z]')))
在我的實際資料中,正如我上面提到的,每個觀察的第一個元素可以是數字 0-9 中的任何一個,或字母 AZ。
現在,我所做的是創建一個新變數 [value],它根據 V1 變數中每個觀察值的第一個元素采用特定值(無模式)。因此,如果第一個元素是字母“A”,則我的新變數--V2--中對應觀察(行)的值是 3,如果 V1 變數的第一個元素是“B”,則我的新變數 V2 中的相應觀察值為 12,依此類推。
這是我選擇這樣做的方式。這很笨拙,因為我的真實資料需要所有數字 0-9 和所有字母 AZ 的 ifelse 子句,大約 35 行左右。這是我的代碼:
my.df$value<-ifelse(substr(my.df$V1,1,1)=="A",3,
ifelse(substr(my.df$V1,1,1)=="B",12,
ifelse(substr(my.df$V1,1,1)=="0",44,
ifelse(substr(my.df$V1,1,1)=="1",6,27))))
這產生:
V1 value
'AABAA3122X' 1
'12110FCBCF' 6
'BBAAB5246J' 12
'20112JGEDL' 27
'BBBBA4426X' 12
'02210EDFJK' 44
'ABABB6687N' 1
'20120IAEFD' 27
'ABBBB9905A' 1
'12200HCDHU' 6
有沒有辦法在不使用這么多代碼行的情況下做到這一點?
謝謝!
uj5u.com熱心網友回復:
考慮與鍵/值資料或命名向量的連接
my.df$value <- with(my.df, setNames(c(3, 12, 44, 6),
c("A", "B", "0", "1"))[substr(V1, 1, 1)])
my.df$value[is.na(my.df$value)] <- "27"
-輸出
> my.df
V1 value
1 AABAA3122X 3
2 12110FCBCF 6
3 BBAAB5246J 12
4 20112JGEDL 27
5 BBBBA4426X 12
6 02210EDFJK 44
7 ABABB6687N 3
8 20120IAEFD 27
9 ABBBB9905A 3
10 12200HCDHU 6
uj5u.com熱心網友回復:
兩種可能的方法基于:從查找表更新向量的某些值的規范 tidyverse 方法
library(tidyverse)
library(stringi)
library(data.table)
set.seed(100)
my.df <- data.frame("V1" = sprintf("%s%s%s",
stri_rand_strings(10, 5, c('[A-B]','[0-2]')),
stri_rand_strings(10, 4, c('[0-9]','[A-J]')),
stri_rand_strings(10, 1, '[A-Z]')))
df <- my.df %>%
mutate(Value = substr(V1, 1, 1))
unique(df$Value)
#> [1] "A" "1" "B" "2" "0"
lookup <- data.frame(old = c("A", 1, "B", 2, 0),
new = c(3, 6, 12, 27, 44))
for (i in seq_len(nrow(lookup))) {
df$Value[df$Value == lookup$old[i]] = lookup$new[i]
}
df
#> V1 Value
#> 1 AABAA3122X 3
#> 2 12110FCBCF 6
#> 3 BBAAB5246J 12
#> 4 20112JGEDL 27
#> 5 BBBBA4426X 12
#> 6 02210EDFJK 44
#> 7 ABABB6687N 3
#> 8 20120IAEFD 27
#> 9 ABBBB9905A 3
#> 10 12200HCDHU 6
# data.table method (fastest but doesn't retain original order of V1)
df <- my.df %>%
mutate(Value = substr(V1, 1, 1))
setDT(df)
setDT(lookup)
setkey(df, Value)
setkey(lookup, old)
df[lookup, Value:=new, on=.(Value=old)]
df
#> V1 Value
#> 1: 02210EDFJK 44
#> 2: 12110FCBCF 6
#> 3: 12200HCDHU 6
#> 4: 20112JGEDL 27
#> 5: 20120IAEFD 27
#> 6: AABAA3122X 3
#> 7: ABABB6687N 3
#> 8: ABBBB9905A 3
#> 9: BBAAB5246J 12
#> 10: BBBBA4426X 12
由reprex 包(v2.0.1)于 2021 年 10 月 6 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316389.html
下一篇:繞過App檢測抓包
