在这里学习R代码。这是我的数据集,然后我将详细解释我想要实现的目标:
alp <- c("a", "b", "c","d", "e", "f")
num <- c(1:6)
my.set <- data.frame(num, alp)
看起来像这样:
num alp
1 a
2 b
3 c
4 d
5 e
6 f
包含6行和2列的数据集。 (对不起,我花了很多时间写完这一切,我无法弄清楚如何在数据集中包含空格以便在屏幕上显示得很好)
我需要创建一个for
循环或一个函数,我可以随机选择多行(0到6行)并切换它们各自的列值。换句话说,选择我们剥离标签的随机行数,并使用num
值翻转alp
值。
要让它看起来像这样(假设选择了2行进行更改):
num alp
a 1
2 b
3 c
d 4
5 e
6 f
我是这样做的:对于每一行,我想要翻转一枚硬币。如果它是头(或0),则切换其列值。如果它的尾巴(或1)没有任何反应。
到目前为止我已经有了这个,但是它会抛出错误信息:
for (j in 1:nrow(my.set)) {
flip <- sample(0:1, 1, replace = TRUE)
if (flip==0) {
my.set[j,1:2] <- my.set[j,2:1]
} else {
my.set[j,1:2] <- my.set[j,1:2]
}
}
那么我做错了什么,我该如何解决这个问题呢?任何帮助表示赞赏!
谢谢!
答案 0 :(得分:0)
您可以使用apply和sample来完成此任务。 apply比r中的for循环要好。你告诉它要经过什么数据帧(my.set),然后遍历行(1表示行,2表示列)然后给它你想要的功能。在这种情况下,我们希望它以随机顺序放置列号,这是&#34;样本(长度(x))&#34;确实
my.set <- apply(my.set, 1, function(x) x[sample(length(x))])
或者,如果您真的宁愿使用for循环,那么您就近了。
my.set <- data.frame(num, alp, stringsAsFactors=F)
for (j in 1:nrow(my.set)) {
flip <- sample(1:2)
my.set[j,1:2] <- my.set[j,flip]
}
答案 1 :(得分:0)
你可以用矢量化的方式做到这一点,不需要任何类型的循环。
首先,我将重新创建数据集,并删除类factor
的列
然后代码创建索引flip
并更改相应的行。
my.set <- data.frame(num, alp, stringsAsFactors = FALSE)
set.seed(1943) # Make the results reproducible
flip <- which(sample(0:1, nrow(my.set), replace = TRUE) == 1)
my.set[flip, 1:2] <- my.set[flip, 2:1]
my.set
# num alp
#1 a 1
#2 b 2
#3 3 c
#4 4 d
#5 5 e
#6 f 6