在包含字符的数据框中处理一些数值库仑

时间:2019-05-26 08:05:32

标签: r data-manipulation

我有一个包含字符和数字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,而其他字符保持不变。

谢谢! 伊丹

2 个答案:

答案 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关于如何对列表进行子集化。