我开始 R 用户,我对我遇到的问题有疑问:
在清理一些数据后,我需要将列表缩小到更易管理的大小。由于我对捐赠者不止一次捐赠感兴趣,我决定尝试限制数据集的大小。
数据集加载为“cont”
我的意图:
提及的地图频率:
> table(cont$contributor_name) -> FreqCon
> subset(FreqCon,Freq>4) -> FMI
插入一个额外的列作为cont [,43],名称为“include”,对于我是否应该对其进行子集,将为TRUE或FALSE
for(i in 1:dim(FMI)[1]){
+ ifelse(cont[i,11] %in% FMI[,1],cont[i,43] <- TRUE, cont[i,43] <- FALSE) }
根据cont$include
我希望这是所有相关信息。如果需要,我很乐意提供更多信息!
也:cont[,11] = cont$contributor_name
问题:目前, R 工作非常努力,但似乎没有改变列中的任何内容。我很困惑我做错了什么,因为我没有得到任何warnings()
或错误。
也许我正在尝试重新发明轮子所以任何完成我要做的事情的方式都会非常感激!
答案 0 :(得分:4)
您不需要循环。这就是矢量化旨在解决的问题。
FreqCon <- table(cont$contributor_name)
FMI <- names(FreqCon)[FreqCon > 4]
small_cont <- subset(cont, contributor_name %in% FMI)
答案 1 :(得分:3)
听起来你只是想按频率进行分组。如果是这种情况,可以使用以下内容:
mydf[mydf$V1 %in% names(which(table(mydf$V1) > 1)), ]
# V1 V2
# 4 s -0.30538839
# 5 e 1.51178117
# 7 s -0.62124058
# 11 e -0.01619026
逻辑是在“V1”列上运行table
(数据集的“contributor_name”),然后确定哪些符合您的条件(这里我将其设置为任何“V1”)这不止一次发生。)
无需创建另一列作为中间步骤。
如果这确实是您所追求的,并且您拥有大量数据,则可能需要考虑使用data.table
包:
> library(data.table)
> DT <- data.table(mydf)
> DT[, N := .N, by = "V1"][N > 1]
V1 V2 N
1: s -0.30538839 2
2: e 1.51178117 2
3: s -0.62124058 2
4: e -0.01619026 2
在上文中,.N
与table
类似data.table
, 创建新列(在本例中,名为“N”)。语法与基本R略有不同,但它对大数据应该更有效。
对于这些示例,mydf
定义如下:
set.seed(1)
mydf <- data.frame(V1 = sample(letters[1:20], 12, replace = TRUE),
V2 = rnorm(12))
# V1 V2
# 1 f 0.48742905
# 2 h 0.73832471
# 3 l 0.57578135
# 4 s -0.30538839
# 5 e 1.51178117
# 6 r 0.38984324
# 7 s -0.62124058
# 8 n -2.21469989
# 9 m 1.12493092
# 10 b -0.04493361
# 11 e -0.01619026
# 12 d 0.94383621