现在我在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语言,或者我可以自己装一些东西)
答案 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'的总发生次数
如果您希望获得ball
和disk
在数据框中显示的总次数,您可以grep
使用length
来返回单个数字:
> length(grep("^(ball|disk)",unlist(df)))
[1] 12
更通用的substr
方法
对@ Ananda的解决方案采取不同的看法:
table(substr(unlist(df), 1, 4), useNA="ifany")
这有两个好处:
column
。NA
个值,因此您可以知道NA
出现的次数。 结果:
> 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