我有一个包含字符和数字coulomns的数据框。在某些数字库仑中,我想测试该值是否小于1,如果是,则要将其更改为1。
我设法将所有不同的值从0都变成1,但这包括字符和一列我也希望保持不变的列...
def addnewrow(*arge) # Change to this
> species<- c("Pinus halepensis", "Majorana syriaca", "Iris
> palaestina","Velezia fasciculata")
> rarness<- c("F", "CC", "F", "O")
> endangered<-c(0,0,0,6.8) plot1<- c(1,2,1,1) plot2<- c(0,1,0,0)
> df<-as.data.frame(cbind(species, rarness, endangered, plot1, plot2))
Test<-df %>%
mutate(plot1 = ifelse(plot1 > 1, 1, plot1))
我希望coulomns“ plot1”和“ Plot2”仅包含字符0和1,而其他字符保持不变。
谢谢! 伊丹
答案 0 :(得分:0)
主要是因为您在数据框列中有一些因素。您需要先将列更改为数字,然后再将其转换为1/0。
library(dplyr)
df %>%
mutate_at(vars(plot1, plot2), ~as.integer(as.numeric(as.character(.)) > 1))
# species rarness endangered plot1 plot2
#1 Pinus halepensis F 0.0 0 0
#2 Majorana syriaca CC 0.0 1 0
#3 Iris palaestina F 0.0 0 0
#4 Velezia fasciculata O 6.8 0 0
或者类似的使用基数R会
df[4:5] <- lapply(df[4:5], function(x) as.integer(as.numeric(as.character(x)) > 1))
答案 1 :(得分:0)
您还可以在应用条件之前制作一个副本。您需要指定列以仅处理那些列。如果只有两列,则可以这样手动进行:
# Create copy
test <- df
# Update specific column
test$plot1[(as.numeric(test$plot1)) > 1] <- 1
test$plot2[(as.numeric(test$plot2)) > 1] <- 1
test
# species rarness endangered plot1 plot2
# 1 Pinus halepensis F 0 1 0
# 2 Majorana syriaca CC 0 1 1
# 3 Iris palaestina F 0 1 0
# 4 Velezia fasciculata O 6.8 1 0
现在,假设您要处理一组列。您可以在应用于所有列的函数中重复使用前面的技巧。建议您看看apply
家庭。 Here一个很好的解释。在我们的任务中,lapply
似乎是(doc)的代表。
# Your dataframe
species<- c("Pinus halepensis", "Majorana syriaca", "Iris palaestina","Velezia fasciculata")
rarness<- c("F", "CC", "F", "O")
endangered<-c(0,0,0,6.8)
plot1<- c(1,2,1,1)
plot2<- c(0,1,0,0)
df<- as.data.frame(cbind(species, rarness, endangered, plot1, plot2))
# Extend the dataframe with new random columns for the example
df2 <- data.frame(replicate(10,sample(-5:5,4,rep=TRUE)))
df[names(df2)] <- df2
df
# species rarness endangered plot1 plot2 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1 Pinus halepensis F 0 1 0 -4 -2 4 4 0 5 -1 -5 3 2
# 2 Majorana syriaca CC 0 2 1 5 -3 -2 3 3 -1 0 5 2 4
# 3 Iris palaestina F 0 1 0 -1 2 -2 5 3 2 3 3 -1 -3
# 4 Velezia fasciculata O 6.8 1 0 -5 -3 4 5 5 -4 4 -5 -4 -3
# Create copy
test <- df
# Function to apply at each column
set_threshold <- function(col){
col <- as.numeric(col);
col[col > 1] <- 1;
return (col);
}
# Select all column names after the index 4
col_names <- tail(names(test),-3)
col_names
# [1] "plot1" "plot2" "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9" "X10"
# Process each column
test[col_names] <- lapply(test[col_names], FUN = set_threshold)
test
# species rarness endangered plot1 plot2 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1 Pinus halepensis F 0 1 1 -4 -2 1 1 0 1 -1 -5 1 1
# 2 Majorana syriaca CC 0 1 1 1 -3 -2 1 1 -1 0 1 1 1
# 3 Iris palaestina F 0 1 1 -1 1 -2 1 1 1 1 1 -1 -3
# 4 Velezia fasciculata O 6.8 1 1 -5 -3 1 1 1 -4 1 -5 -4 -3
我使用tail
选择索引4之后的所有列名称(例如,删除所有元素直到索引3)(doc)。 A discussion关于如何对列表进行子集化。