我有一个像这样的数据框
gender <- sample( c("M","F"), 10000, replace=TRUE, prob=c( 0.5, 0.5) )
handed <- sample( c("L","R"), 10000, replace=TRUE, prob=c( 0.2, 0.8) )
data <- data.frame(gender=gender,handed=handed)
我需要替换来自此子集的前100行
d <- subset(data,gender=="M" & handed=="R",)
我知道
da <- head(d,n=100)
但我不知道如何在data
中替换它们。
我想将其替换为:
gender=="F" & handed=="L
我尝试过这个解决方案:
Conditions_Seperator<-function(condition){return (unlist(strsplit(condition, "")))}
con<-Conditions_Seperator("MR")
replaceing_con<-Conditions_Seperator("FL")
library(data.table)
setDT(data)[data[, .I[gender==as.character(con[1]) & handed == as.character(con[2])][1:size_to_decrease]],
c('gender', 'handed') := .(as.character(replaceing_con[1]), as.character(replaceing_con[2]))][]
,输出为:
handed
gender L R M
F 6122 95 3592
M 96 95 0
它为我的数据集添加了一列
答案 0 :(得分:2)
我们可以尝试找到前100&#34; TRUE&#34;的位置。具有which
和head
的值,并使用这些索引对原始数据框中的行进行子集化,并通过生成要使用rep
更新的值的向量来更新它们。
subs <- head(which(data$gender=="M" & data$handed=="R"), 100)
data[subs, ] <- rep(c("F", "L"), each = 100)
只是为了重现性,这是一个包含10行且仅更新2行的小例子。
set.seed(24)
gender <- sample( c("M","F"), 10, replace=TRUE, prob=c( 0.5, 0.5) )
handed <- sample( c("L","R"), 10, replace=TRUE, prob=c( 0.2, 0.8) )
data <- data.frame(gender=gender,handed=handed)
data
# gender handed
#1 F R
#2 F R
#3 M R
#4 M R
#5 M R
#6 M L
#7 F R
#8 M R
#9 M R
#10 F R
subs <- head(which(data$gender=="M" & data$handed=="R"), 2)
subs
#[1] 3 4
data[subs, ] <- rep(c("F", "L"), each = 2)
data
# gender handed
#1 F R
#2 F R
#3 F L
#4 F L
#5 M R
#6 M L
#7 F R
#8 M R
#9 M R
#10 F R
答案 1 :(得分:2)
这是使用双下标的第二个基本R方法。
使用ronak-shah的数据,我们从
开始with(data, table(gender, handed))
handed
gender L R
F 0 4
M 1 5
每组,然后使用
data[data$gender=="M" & data$handed=="R",][1:2,] <- data.frame(gender="F", handed="L")
用左撇子女性取代前两名右撇子男性。我们最终得到了
with(data, table(gender, handed))
handed
gender L R
F 2 4
M 1 3
答案 2 :(得分:1)
以下是使用data.table
library(data.table)
setDT(data)[data[, .I[gender=="M" & handed == "R"][1:100]],
c('gender', 'handed') := .('F', 'L')][]
# gender handed
# 1: F R
# 2: F R
# 3: M L
# 4: F L
# 5: M L
# ---
# 9996: F R
# 9997: F R
# 9998: F R
# 9999: M L
#10000: M R
更新问题
setDT(data)[data[, .I[gender==con[1] & handed == con[2]][seq_len(size_to_decrease)]],
c('gender', 'handed') := .(replaceing_con[1], replaceing_con[2])][]
table(data)
# handed
#gender L R
# F 1068 4075
# M 986 3871