在R数据帧编码的下面,我想更换所有时代B
与出现b.
junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")
Run Code Online (Sandbox Code Playgroud)
这提供:
nm val
1 A a
2 B b
3 C c
4 D d
5 A e
6 B f
7 C g
8 D h
9 A i
10 B j
11 C k
12 D l
Run Code Online (Sandbox Code Playgroud)
我最初的尝试是使用for和if语句,像这样:
for(i in junk$nm) if(i %in% "B") junk$nm <- "b"
Run Code Online (Sandbox Code Playgroud)
但我相信你可以看到,这个替换所有的值junk$nm用b.我可以看到为什么这样做但我似乎无法让它只替换原始值为的那些垃圾$ nm的情况B.
注意:我设法解决了问题 …
我经常需要根据查找表重新编码数据框列中的一些(不是全部!)值。我对我所知道的解决问题的方法并不满意。我希望能够以一种清晰、稳定和高效的方式做到这一点。在我编写自己的函数之前,我想确保我没有复制已经存在的标准。
## Toy example
data = data.frame(
id = 1:7,
x = c("A", "A", "B", "C", "D", "AA", ".")
)
lookup = data.frame(
old = c("A", "D", "."),
new = c("a", "d", "!")
)
## desired result
# id x
# 1 1 a
# 2 2 a
# 3 3 B
# 4 4 C
# 5 5 d
# 6 6 AA
# 7 7 !
Run Code Online (Sandbox Code Playgroud)
我可以通过加入、合并、取消选择来做到这一点,如下所示,但这并不像我想要的那么清楚- 步骤太多。
## This works, but …Run Code Online (Sandbox Code Playgroud) 我经常遇到这种情况,我认为必须有一个很好的成语.假设我有一个包含一系列属性的data.frame,包括"product".我还有一把钥匙,可以将产品转化为品牌+尺寸.产品代码1-3是Tylenol,4-6是Advil,7-9是拜耳,10-12是Generic.
什么是最快的(就人类时间而言)编码方式?
ifelse如果有3个或更少的类别,我倾向于使用嵌套的;如果有超过3个类型,则键入数据表并将其合并.任何更好的想法?Stata有一个非常漂亮的recode命令,虽然我相信它会促进数据代码混合有点过分.
dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA,
-20L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud) 我找不到与我在这里遇到的问题类似的问题。我有一个非常大的命名向量列表,与数据框中的列名称匹配。我想使用命名向量列表来替换数据帧列中与每个列表元素名称匹配的值。也就是说,列表中向量的名称与数据帧列的名称匹配,每个向量元素中的键值对将用于重新编码该列。
代表如下:
library(tidyverse)
# Starting tibble
test <- tibble(Names = c("Alice","Bob","Cindy"),
A = c(3,"q",7),
B = c(1,2,"b"),
C = c("a","g",9))
# Named vector
A <- c("5" = "alpha", "7" = "bravo", "3" = "charlie", "q" = "delta")
B <- c("1" = "yes", "2" = "no", "b" = "bad", "c" = "missing")
C <- c("9" = "beta", "8" = "gamma", "a" = "delta", "g" = "epsilon")
# Named list of named vectors
dicts <- list("A" = A, "B" = B, "C" …Run Code Online (Sandbox Code Playgroud) 如果我在管道中使用重新编码,我收到一个错误:
df <- df %>%
recode(unit, .missing="g")
Run Code Online (Sandbox Code Playgroud)
UseMethod("recode")中的错误:没有适用于"recode"的方法应用于类"c('tbl_df','tbl','data.frame')的对象"
如果我将它拉出管道,它可以正常工作:
df$unit <- recode(df$unit, .missing="g")
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?如果可能的话,我想留在管道里.
我想将一个命名向量或两个向量传递给dplyr :: recode.假设我有:
library(dplyr)
set.seed(1)
x <- c("customer", sample(c("a", "b", "c"), 10, replace = TRUE))
recode_tbl <- tibble(letter = letters[1:3], fruit = c("apple", "banana", "cranberry"))
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用recode_tbl的列重新编码x,而不必手动指定对:
recode(x, a = "apple", b = "banana", c = "cranberry")
Run Code Online (Sandbox Code Playgroud)
就像是:
recode(x, as.name(recode_tbl$letter) = recode_tbl$fruit)
Run Code Online (Sandbox Code Playgroud)
这显然不起作用.我并不反对尝试NSE,但是如果有人能够得到足够的球,那就太棒了.
谢谢.
我的数据看起来像这样
Q3A1<-c(0,1,0,1,1,1,0,1,0,1)
Q3A2<-c(0,1,1,1,0,1,0,0,0,1)
Q3A3<-c(1,1,0,1,0,1,0,0,0,1)
Run Code Online (Sandbox Code Playgroud)
我想创建一个新变量 Q3L,当 Q1A1、Q1A2 和 Q1A3 都等于 1 时,它被编码为 1
我试过这个
dataQ$Q3L <- ifelse(dataQ$Q3A1==1|dataQ$Q3A2==1|dataQ$Q3A3==1, 1, 0 )
Run Code Online (Sandbox Code Playgroud)
但如果三个中至少有一个等于 1,它似乎会重新编码为 1,但我需要它们的树等于 1
我也尝试过这个
library(dplyr)
dataQ %>%
mutate(Q3L = case_when(Q3A1 == 1 & Q3A2 == 1 & Q3A3 == 1 ~ 1,))
Run Code Online (Sandbox Code Playgroud)
也没有成功
我正在尝试使用data.table重新编码变量.我用谷歌搜索了近2个小时,但找不到答案.
假设我有一个data.table如下:
DT <- data.table(V1=c(0L,1L,2L),
V2=LETTERS[1:3],
V4=1:12)
Run Code Online (Sandbox Code Playgroud)
我想重新编码V1和V2.对于V1,我想将1s重新编码为0和2s为1.对于V2,我想重新编码A到T,B到K,C到D.
如果我使用dplyr,很简单.
library(dplyr)
DT %>%
mutate(V1 = recode(V1, `1` = 0L, `2` = 1L)) %>%
mutate(V2 = recode(V2, A = "T", B = "K", C = "D"))
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在data.table中执行此操作
DT[V1==1, V1 := 0]
DT[V1==2, V1 := 1]
DT[V2=="A", V2 := "T"]
DT[V2=="B", V2 := "K"]
DT[V2=="C", V2 := "D"]
Run Code Online (Sandbox Code Playgroud)
以上是我认为最好的代码.但必须有一种更好,更有效的方法来做到这一点.
编辑
我改变了我想重新编码V2的方式,使我的例子更加通用.
样本数据:
df <- data.frame("ID" = 1:6,
"Group1" = c("A", NA, "C", NA, "E", "C"),
"Group2" = c("E", "C", "C", NA, "E", "E"),
"Group3" = c("A", "A", NA, NA, "C", NA),
"Group4" = c(NA, "C", NA, "D", "C", NA),
"Group5" = c("A", "D", NA, NA, NA, NA))
Run Code Online (Sandbox Code Playgroud)
在每一行中,我想计算每个值的数量并将最频繁的值存储在一个新变量中New.Group。在平局的情况下,应选择行中的第一个值。应用于示例的逻辑:
的第 1 行New.Group取值,A因为它是该行中出现频率最高的值,忽略NAs。
第 2 行有价值,C因为它也是最常见的值。
第 3 行与第 2 行相同。
第 4 行具有值,D因为它是该行中唯一的值。
在第 5 行中,E和C计数为 …
我有包含以下两列的数据框
Tumor_Barcode SEX
MEL-JWCI-WGS-1 Male
MEL-JWCI-WGS-11 Male
MEL-JWCI-WGS-12 Female
MEL-JWCI-WGS-13 Male
Run Code Online (Sandbox Code Playgroud)
我想将列重新编码Tumor_Barcode为第三列Sample_ID,输出应如下所示。
Tumor_Barcode Sex Sample_ID
MEL-JWCI-WGS-1 Male ME001
MEL-JWCI-WGS-11 Male ME011
MEL-JWCI-WGS-12 Female ME012
MEL-JWCI-WGS-13 Male ME013
Run Code Online (Sandbox Code Playgroud)
无论如何我可以在 R 中做到这一点吗?
数据:
Tumor_Barcode<-c(" MEL-JWCI-WGS-1","MEL-JWCI-WGS-11","MEL-JWCI-WGS-12","MEL-JWCI-WGS-13")
Sex<-c("Male", "Male", "Female", "Male")
DF1<-data.frame(Tumor_Barcode,Sex)
Run Code Online (Sandbox Code Playgroud)