我有一个data.frame。我试图使用第2,3,4列中的值来为col1中的值赋值。这可能吗?
dat<-data.frame(col1=c(1,2,3,4,5), col2=c(1,2,3,4,"U"), col3=c(1,2,3,"U",5), col4=c("U",2,3,4,5))
dat1=data.frame(col1=ifelse(dat$col2=="U"|dat$col3=="U"|dat$col4=="U", dat$col1=="U", dat$col1))
col1
0
2
3
0
0
为什么我应该得到一个U应该是哪个?
答案 0 :(得分:4)
请勿在{{1}}功能中进行分配。
ifelse
答案 1 :(得分:1)
你可能想要使用它:
dat1 <- data.frame(col1=ifelse(dat$col2=="U"|dat$col3=="U"|dat$col4=="U", "U", dat$col1))
# I changed the dat$col1=="U" to just "U"
<小时/>
如果问题是"Why am I getting a 0 where a U should be?"
,答案就在于您为ifelse(.)
声明的if-TRUE部分分配的内容。
你的ifelse陈述基本上是说
if any of columns 2 through 4 are U
then assign the value of `does column 1 == "U"` <-- Not sure if this is what you want
else assign the value of column 1
因此,当您的ifelse测试评估为TRUE
时,您返回的是col1=="U"
的值,但强制转换为整数。即:0表示FALSE,1表示TRUE
您还可以利用T / F评估为1/0来清理代码:
# using the fact that rowSums(dat[2:4]=="U") will be 0 when "U" is not in any column:
ifelse(rowSums(dat[2:4]=="U")>0, "U", dat$col1)
答案 2 :(得分:0)
any()
让这样的事情变得更加整洁
head(dat)
col1 col2 col3 col4
1 1 1 1 U
2 2 2 2 2
3 3 3 3 3
4 4 4 U 4
5 5 U 5 5
apply(dat,1, function(x)any(x=='U'))
[1] TRUE FALSE FALSE TRUE TRUE
dat[apply(dat,1, function(x)any(x=='U')), 1] <-'U'
dat
col1 col2 col3 col4
1 U 1 1 U
2 2 2 2 2
3 3 3 3 3
4 U 4 U 4
5 U U 5 5
答案 3 :(得分:0)
一种简单的方法是:
dat$col1[as.logical(rowSums(dat[-1]=="U"))] <- "U"
col1 col2 col3 col4
1 U 1 1 U
2 2 2 2 2
3 3 3 3 3
4 U 4 U 4
5 U U 5 5