我有一个包含3个变量和250K记录的数据帧.作为一个例子考虑
df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
V1 V2 V3
1 a 2
2 a 3
4 b 1
Run Code Online (Sandbox Code Playgroud)
并希望基于V2的值V1和V3之间切换值如下:如果V2 == 'b'然后V1 <- V3和V3 <- V1
导致
V1 V2 V3
1 a 2
2 a 3
1 b 4
Run Code Online (Sandbox Code Playgroud)
我试过一个do循环,但它需要永远.如果我使用Perl,则需要几秒钟.我相信这项任务也可以在R中有效地完成.任何建议表示赞赏.
Ryo*_*ogi 17
试试这个
df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")]
Run Code Online (Sandbox Code Playgroud)
pau*_*aul 13
你可以transform用来做这件事.
df <- transform(df, V3 = ifelse(V2 == 'b', V1, V3), V1 = ifelse(V2 == 'b', V3, V1))
Run Code Online (Sandbox Code Playgroud)
编辑我被列名绊倒了,抱歉。这有效。
如果您不介意行以不同的顺序结束,这是一种“可爱”的方法:
dat <- read.table(textConnection("V1 V2 V3
1 a 2
2 a 3
4 b 1"),sep = "",header = TRUE)
tmp <- dat[dat$V2 == 'b',3:1]
colnames(tmp) <- colnames(dat)
rbind(dat[dat$V2 != 'b',],tmp)
Run Code Online (Sandbox Code Playgroud)
基本上,这只是抓取 所在的行V2 == 'b',反转列并将其与其他所有内容重新组合在一起。如果您有更多不需要切换的列,则可以扩展此功能;您只需使用转置这些值的整数索引,而不仅仅是3:1.