我需要在多列数据框中转换数据,并想找到一种方法一次在数据框的所有列中进行转换。数值数据的数据转换似乎没有问题。例如:
df <- data.frame(
co1 = c(5,9,6,1,6),
co2 = c(8,5,4,6,2),
co3 = c(6,5,4,1,2),
co4 = c(6,1,5,3,2),
co5 = c(5,1,2,6,8))
我可以使用for循环一次转换所有数据(例如,将所有大于5的值标记为“是”,将所有其他值标记为“否”):
for(i in 1:ncol(df)){
df[i] <- ifelse(df[i] > 5, "yes", "no")
}
或者,更简单地说,使用索引:
df[] <- ifelse(df > 5, "yes", "no")
但是,当我有字符数据时,这些方法不起作用。例如,我想将此数据帧中所有以“ A”开头的值转换为“是”:
df <- data.frame(
co1 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co2 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co3 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co4 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co5 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")))
df
co1 co2 co3 co4 co5
1 JF GB ID EB DF
2 IA DD DA IF HD
3 HI IH JE CH FB
4 GE JI CJ BA GE
5 BG EE GG AJ BH
for循环
for(i in 1:ncol(df)){
df[i] <- ifelse(grepl("^B", df[i]), "yes", "no")
}
以及通过索引进行转换都会产生相同的错误转换:
df[] <- ifelse(grepl("^B", df), "yes", "no")
df
co1 co2 co3 co4 co5
1 no no no no no
2 no no no no no
3 no no no no no
4 no no no no no
5 no no no no no
对如何使用字符数据实现正确的转换有帮助吗?
如果您想坚持以R为底,lapply
可以在这里工作:
set.seed(123)
df <- data.frame(
co1 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co2 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co3 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co4 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
co5 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")))
df2 <- as.data.frame(lapply(df, function(x) ifelse(grepl("^B", x), "yes", "no")))
co1 co2 co3 co4 co5
1 CA JI IH JE BB
2 HE EC GE IG DC
3 DH FA FI FB ID
4 GD IJ JC HC CJ
5 FC AF DA AH AF
co1 co2 co3 co4 co5
1 no no no no yes
2 no no no no no
3 no no no no no
4 no no no no no
5 no no no no no
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句