返回单词

时间:2016-01-31 04:15:18

标签: r

现在我在R中有以下代码行:

counts = table(unlist(dataTable[, grep('column', names(dataTable))]))

并有一个类似于此的数据表:

print(dataTable)

 column_1   column_2   column_3
  ball.3     ball.3     ball.3
  NA         ball.1     ball.1
  ball.3     NA         ball.2
  NA         NA         NA      
  ball.2     ball.2     ball.1
  ball.1     NA         ball.1
  disk.1     disk.2     NA
  disk.2     disk.2     disk.3
  disk.2     disk.1     NA

此代码目前将提取“ball.1”,“ball.2”,“ball.3”,“disk.1”,“disk.2”和“disk.3”的所有实例,并将放置他们进入如下表所示的表格:

print(counts)

ball.1       ball.2      ball.3      disk.1      disk.2      disk.3
   5            3           4          2           4           1

现在,我正试图找到一种方法让grep只查找世界中的前n个字母并将该计数分配给一个类别。例如,在这个数据集中,我不太关心ball.1对ball.2对ball.3,但更愿意只计算单词以“ball”开头的次数或“磁盘”,忽略了前n = 4个字母之后的任何内容。

最好是以一种我可以专注于寻找任何单词的前四个字母的方式工作,这样我就会有一个如下所示的数据表:

ball         disk
 12           7 

我的推理:

我处理包含许多长物种名称的非常​​大的数据集。有时候,有人可能会在一个单词的后面附上一个数字,或者在某处留下/添加一个字母。如果我可以缩小我的代码的搜索参数以仅搜索名称中的前n个字母,我将消除必须通过.csv文件并仔细检查1000多行名称以进行拼写。我已经找到了解决这个问题的方法,但是只用其他语言找到了它们(不幸的是没有用C语言,或者我可以自己装一些东西)

5 个答案:

答案 0 :(得分:7)

您可以尝试使用substr

table(substr(unlist(mydf[, grep("column", names(mydf))]), 1, 4))
## 
## ball disk 
##   12    7 

如果您愿意,也可以使用sub / gsub,也许是这样的:

table(gsub("(^.{4}).*", "\\1", unlist(mydf[, grep("column", names(mydf))])))
## 
## ball disk 
##   12    7 

答案 1 :(得分:3)

根据您的情况,以下是其他两种解决方案。

'Ball'和'Disk'的总发生次数

如果您希望获得balldisk在数据框中显示的总次数,您可以grep使用length来返回单个数字:

> length(grep("^(ball|disk)",unlist(df)))

[1] 12

更通用的substr方法

对@ Ananda的解决方案采取不同的看法:

 table(substr(unlist(df), 1, 4), useNA="ifany")

这有两个好处:

  1. 它不关心列名是什么。这意味着他们不必包含column
  2. 它将计算NA个值,因此您可以知道NA出现的次数。
  3. 结果:

    > table(substr(unlist(df), 1, 4), useNA="ifany")
    
    ball  disk  <NA>
      12     7     8
    

答案 2 :(得分:3)

可以通过删除sub

后面的子字符串.来完成
 table(sub('\\.\\d+', '', unlist(dataTable)))
 #
 #ball disk 
 # 12    7 

答案 3 :(得分:0)

stringr包效果很好

table(apply(dataTable, MARGIN = 1, FUN = stringr::str_sub, 1, 4))

答案 4 :(得分:0)

如果您决定将数据保持为data.table,那么我一直在玩的内容可能会很有用。

library(data.table)

DT <- data.table(column_1=c('ball.3', NA, 'ball.3', NA, 'ball.2',
                            'ball.1', 'disk.1', 'disk.2', 'disk.2'),
                 column_2=c('ball.3', 'ball.1', NA, NA, 'ball.2', NA,
                            'disk.2', 'disk.2', 'disk.1'),
                 column_3=c('ball.3', 'ball.1', 'ball.2', NA, 'ball.1',
                            'ball.1', NA, 'disk.3', NA))

使用%like%与使用%in%类似,但功能类似'grep'

Find values in 'column_1' containing 'ball' and return a logical vector
DT[, column_1 %like% 'ball']

[1]  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE

Find values in column_1 containing 'ball' and return a table of logical values
DT[, table(column_1 %like% 'ball')]

FALSE  TRUE 
5     4 

Find values in 'column_1' containing 'ball' or 'disk' and create a new column to categorize each value as 'ball' or 'disk'
return a table of counts in each category
DT[, category :=
     ifelse(column_1 %like% 'ball', 'ball',
           ifelse(column_1 %like% 'disk', 'disk', NA))
   ][, table(category)] # this code adds a column 'category' to the DT which is not helpful for multiple columns with identical data.

category
ball disk 
4    3 

Find values in 'column_1' containing 'ball' and return a count
DT[column_1 %like% 'ball', .N]

[1] 4

如果您有多个重复的数据(即物种名称),意味着多次使用相同的值,您只想查看可以使用unique的唯一变体,但这可能不是如果许多名称附加日期或除整数之外的其他内容,则非常有用。

Find unique values in all columns returning a new DT smaller than DT
DT[, lapply(.SD, unique), .SDcols = c('column_1', 'column_2', 'column_3')]

> DT[, lapply(.SD, unique), .SDcols = c('column_1', 'column_2', 'column_3')]
  column_1 column_2 column_3
1:   ball.3   ball.3   ball.3
2:       NA   ball.1   ball.1
3:   ball.2       NA   ball.2
4:   ball.1   ball.2       NA
5:   disk.1   disk.2   disk.3
6:   disk.2   disk.1   ball.3

如果您发现某个值不正确或无效,您可以将其替换为可以简化搜索的新值。

DT[column_1 == 'ball.3'] <- 'new.value'


   column_1  column_2  column_3
1: new.value new.value new.value
2:        NA    ball.1    ball.1
3: new.value new.value new.value
4:        NA        NA        NA
5:    ball.2    ball.2    ball.1
6:    ball.1        NA    ball.1
7:    disk.1    disk.2        NA
8:    disk.2    disk.2    disk.3
9:    disk.2    disk.1        NA