簡體   English   中英

如何在R中的數據框中添加列

[英]How do add a column in a data frame in R

我已經將文件中的數據導入到R中的數據框中。就像這樣。

Name      Count   Category
A         100     Cat1
C         10      Cat2
D         40      Cat1 
E         30      Cat3
H         3       Cat3
Z         20      Cat2
M         50      Cat10

所以現在我想添加Category列,具體取決於Name列中的值。 如果Name =(A,D),Category ='Cat1'等等。

這只是我給出的一個簡單例子。 我有大量的名稱和類別,所以我想要一個緊湊的語法。 我怎樣才能做到這一點?

編輯:我已經更改了示例以更好地滿足我的需求,因為名稱可以是任何數字。 很抱歉以前不太清楚。

你可以使用ifelse 如果您的數據幀被稱為df你會怎么做:

df$cat <- ifelse(df$name<100, "Ones", "Hundreds")
df$cat <- ifelse(df$name<1000, df$cat, "Thousands")

你可以使用地圖。 (更新為使用stringsAsFactors = FALSE

df <- data.frame( Name = c('A', 'C', 'D', 'E', 'H', 'Z', 'M'), 
                  Count = c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)
Categories <- list(Cat1 = c('A','D'), 
                   Cat2 = c('C','Z'), 
                   Cat3 = c('E','H'), 
                   Cat10 = 'M')
nams <- names( Categories )
nums <- sapply(Categories, length)
CatMap <- unlist( Map( rep, nams, nums ) )
names(CatMap) <- unlist( Categories )

df <- transform( df, Category = CatMap[ Name ])

[根據OP的評論更新並更改了Q]

DF <- data.frame(Name = c("A","C","D","E","H","Z","M"),
                 Count = c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)
lookup <- data.frame(Name = c("A","C","D","E","H","Z","M"),
                     Category = paste("Cat", c(1,2,1,3,3,2,10), sep = ""),
                     stringsAsFactors = FALSE)

使用上面的數據框,我們可以進行數據庫合並。 您需要為所需的Name Category組合設置lookup ,如果沒有非常大量的Name ,這是可以的(至少您只需要在lookup列出一次,而您不需要按順序執行 - 首先列出所有Cat1 Name ,等等):

> merge(DF, lookup, by = "Name")
  Name Count Category
1    A   100     Cat1
2    C    10     Cat2
3    D    40     Cat1
4    E    30     Cat3
5    H     3     Cat3
6    M    50    Cat10
7    Z    20     Cat2
> merge(DF, lookup, by = "Name", sort = FALSE)
  Name Count Category
1    A   100     Cat1
2    C    10     Cat2
3    D    40     Cat1
4    E    30     Cat3
5    H     3     Cat3
6    Z    20     Cat2
7    M    50    Cat10

一種選擇是索引:

foo <- function(x) {
    out <- character(length = length(x))
    chars <- c("Ones", "Tens", "Hundreds", "Thousands")
    out[x < 10] <- chars[1]
    out[x >= 10 & x < 100] <- chars[2]
    out[x >= 100 & x < 1000] <- chars[3]
    out[x >= 1000 & x < 10000] <- chars[4]
    return(factor(out, levels = chars))
}

更好地擴展的替代方案是,

bar <- function(x, cats = c("Ones", "Tens", "Hundreds", "Thousands")) {
    out <- cats[floor(log10(x)) + 1]
    factor(out, levels = cats)
}

使用ifelse和%in%可能更簡單,更易讀:

df <- data.frame( Name = c('A', 'C', 'D', 'E', 'H', 'Z', 'M'), 
Count =c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)

cat1 = c("A","D")
cat2 = c("C","Z")
cat3 = c("E","H")
cat10 = c("M")

df$Category = ifelse(df$Name %in% cat1, "Cat1",
              ifelse(df$Name %in% cat2, "Cat2",
              ifelse(df$Name %in% cat3, "Cat3",
              ifelse(df$Name %in% cat10, "Cat10",
              NA))))

   Name Count Category
1    A   100     Cat1
2    C    10     Cat2
3    D    40     Cat1
4    E    30     Cat3
5    H     3     Cat3
6    Z    20     Cat2
7    M    50    Cat10

查看:

  • cut()
  • car包中的recode()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM