我的数据集中有以下列:
presult aresult
I single
I double
I triple
I home run
SS strikeout
我想添加第三列“基数”,这取决于列issult中结果的值。
例如,我希望基数为1表示单,2表示双,3表示三重,4表示本垒打,0表示删除。
通常我会像这样创建新变量:
dataset$base<-ifelse(dataset$aresult=="single", 1, 0)
问题是我不知道如何在不将所有其他变量设置为零的情况下编码新变量。
答案 0 :(得分:16)
以下是如何使用命名向量进行查找:
定义测试数据:
dat <- data.frame(
presult = c(rep("I", 4), "SS", "ZZ"),
aresult = c("single", "double", "triple", "home run", "strikeout", "home run"),
stringsAsFactors=FALSE
)
使用分数:
定义命名数字向量score <- c(single=1, double=2, triple=3, `home run`=4, strikeout=0)
使用矢量索引将分数与结果相匹配:
dat$base <- score[dat$aresult]
dat
presult aresult base
1 I single 1
2 I double 2
3 I triple 3
4 I home run 4
5 SS strikeout 0
6 ZZ home run 4
其他信息:
如果您不希望手动构建命名向量,请说明您有大量数据,请按以下步骤操作:
scores <- c(1:4, 5)
names(scores) <- c("single", "double", "triple", "home run", "strikeout")
(或者从现有数据中读取值和名称。重点是构造一个数字向量,然后指定名称。)
答案 1 :(得分:15)
定义您的查找表
lookup= data.frame(
base=c(0,1,2,3,4),
aresult=c("strikeout","single","double","triple","home run"))
然后使用plyr
加入dataset = join(dataset,lookup,by='aresult')
答案 2 :(得分:3)
Dieter's answer的替代方案:
dat <- data.frame(
presult = c(rep("I", 4), "SS", "ZZ"),
aresult = c("single", "double", "triple", "home run", "strikeout", "home run"),
stringsAsFactors=FALSE
)
dat$base <- as.integer(factor(dat$aresult,
levels=c("strikeout","single","double","triple","home run")))-1
答案 3 :(得分:1)
dataset$base <- as.integer(as.factor(dataset$aresult))
根据您的数据,as.factor()可以省略,因为在很多情况下,字符串是默认的因子,例如与read.table